Мое текущее понимание реализации Наследования состоит в том, что следует расширять класс только при наличии отношения IS-A . Если родительский класс может дополнительно иметь более конкретные дочерние типы с различной функциональностью, но будет совместно использовать общие элементы, абстрагированные в родительском.
Я подвергаю сомнению это понимание из-за того, что мой профессор Java рекомендует нам делать. Он рекомендовал для JSwingприложения, которое мы строим в классе
Необходимо расширить все JSwingклассы ( JFrame, JButton, JTextBox, и т.д.) в отдельные пользовательские классы и указать GUI соответствующей настройки в них (например , размер компонента, метки компонента, и т.д.)
Пока все хорошо, но он далее советует, что у каждого JButton должен быть свой собственный расширенный класс, хотя единственным отличительным фактором является его метка.
Например, если в графическом интерфейсе есть две кнопки Okay и Cancel . Он рекомендует расширить их, как показано ниже:
class OkayButton extends JButton{
MainUI mui;
public OkayButton(MainUI mui) {
setSize(80,60);
setText("Okay");
this.mui = mui;
mui.add(this);
}
}
class CancelButton extends JButton{
MainUI mui;
public CancelButton(MainUI mui) {
setSize(80,60);
setText("Cancel");
this.mui = mui;
mui.add(this);
}
}
Как видите, разница только в setTextфункции.
Так это стандартная практика?
Кстати, курс, где это обсуждалось, называется Best Programming Practices на Java
[Ответ от проф.]
Поэтому я обсудил проблему с профессором и затронул все вопросы, упомянутые в ответах.
Его оправдание заключается в том, что подклассы предоставляют код многократного использования при соблюдении стандартов проектирования графического интерфейса. Например, если разработчик использовал пользовательские кнопки Okayи Cancelкнопки в одном окне, будет проще разместить те же кнопки в других окнах.
Я понимаю причину, которую я предполагаю, но все же это просто использование наследования и создание хрупкого кода.
Позже, любой разработчик может случайно вызвать setTextна Okayкнопку и изменить его. Подкласс просто становится неприятностью в этом случае.
JButtonи вызывать открытые методы в его конструкторе, если вы можете просто создатьJButtonи вызвать те же открытые методы вне класса?