Моє сучасне розуміння реалізації Успадкування полягає в тому, що слід розширювати клас лише тоді, коли є відношення IS-A . Якщо батьківський клас може додатково мати більш конкретні дочірні типи з різною функціональністю, але вони матимуть спільні елементи, абстраговані у батьків.
Я ставлю під сумнів це розуміння через те, що рекомендує нам робити мій професор Java. Він порекомендував для JSwing
програми, яку ми будуємо на уроці
Необхідно розширити всі JSwing
класи ( JFrame
, JButton
, JTextBox
, і т.д.) в окремі призначені для користувача класи і вказати GUI відповідного налаштування в них (наприклад , розмір компонента, мітки компонента, і т.д.)
Поки що добре, але далі він радить, що кожен JButton повинен мати власний розширений клас, хоча єдиним відмінним фактором є їх марка.
Наприклад, якщо у GUI є дві кнопки Гаразд та Скасувати . Він рекомендує розширити їх, як зазначено нижче:
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
функції.
Так це стандартна практика?
До речі, курс, де це обговорювалося, називається Кращі практики програмування на Java
[Відповідь професора]
Тож я обговорив проблему з професором і підняв усі моменти, згадані у відповідях.
Його виправданням є те, що підкласифікація надає код для багаторазового використання, дотримуючись стандартів дизайну GUI. Наприклад, якщо розробник використовував користувацькі Okay
та Cancel
кнопки в одному вікні, буде зручніше розмістити ті самі кнопки і в інших Windows.
Я маю на увазі причину, але все-таки це просто використання спадщини та надання коду тендітним.
Пізніше будь-який розробник може випадково зателефонувати setText
на Okay
кнопку та змінити її. Підклас просто стає неприємним у такому випадку.
JButton
та викликати публічні методи у своєму конструкторі, коли ви можете просто створитиJButton
та викликати ті самі публічні методи поза класом?