Моє сучасне розуміння реалізації Успадкування полягає в тому, що слід розширювати клас лише тоді, коли є відношення 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та викликати ті самі публічні методи поза класом?