Nach meinem derzeitigen Verständnis der Vererbungsimplementierung sollte eine Klasse nur erweitert werden, wenn eine IS-A- Beziehung vorhanden ist. Wenn die übergeordnete Klasse über spezifischere untergeordnete Typen mit unterschiedlicher Funktionalität verfügen kann, jedoch gemeinsame, im übergeordneten Element abstrahierte Elemente aufweist.
Ich stelle dieses Verständnis in Frage, weil mein Java-Professor uns empfiehlt, dies zu tun. Er hat empfohlen, dass JSwing
wir für eine Anwendung im Unterricht bauen
Man sollte alle erweitern JSwing
Klassen ( JFrame
, JButton
, JTextBox
, usw.) in separate benutzerdefinierte Klassen und geben Sie GUI ähnliche Anpassung in ihnen (wie die Bauteilgröße, Komponentenbezeichnung usw.)
So weit so gut, aber er rät weiter, dass jeder JButton eine eigene benutzerdefinierte erweiterte Klasse haben sollte, obwohl der einzige Unterscheidungsfaktor das Etikett ist.
Zum Beispiel, wenn die GUI über zwei Schaltflächen OK und Abbrechen verfügt . Er empfiehlt, sie wie folgt zu erweitern:
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);
}
}
Wie Sie sehen, liegt der einzige Unterschied in der setText
Funktion.
Ist das also die Standardpraxis?
Übrigens wird der Kurs, in dem dies besprochen wurde, als Best Programming Practices in Java bezeichnet
[Antwort von Prof]
Deshalb habe ich das Problem mit dem Professor besprochen und alle in den Antworten genannten Punkte angesprochen.
Seine Rechtfertigung ist, dass Unterklassen wiederverwendbaren Code bereitstellen, während sie den Standards für das GUI-Design folgen. Wenn der Entwickler beispielsweise benutzerdefinierte Schaltflächen Okay
und Cancel
Schaltflächen in einem Fenster verwendet hat, ist es einfacher, dieselben Schaltflächen auch in anderen Fenstern zu platzieren.
Ich verstehe den Grund, den ich nehme an, aber es nutzt nur die Vererbung und macht den Code zerbrechlich.
Später könnte jeder Entwickler versehentlich die Schaltfläche setText
on aufrufen Okay
und sie ändern. Die Unterklasse wird in diesem Fall nur zum Ärgernis.
JButton
öffentliche Methoden in ihrem Konstruktor erweitern und aufrufen, wenn SieJButton
diese öffentlichen Methoden einfach außerhalb der Klasse erstellen und aufrufen können?