Мое текущее понимание реализации Наследования состоит в том, что следует расширять класс только при наличии отношения 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
и вызвать те же открытые методы вне класса?