Moje obecne rozumienie implementacji dziedziczenia jest takie, że należy rozszerzać klasę tylko wtedy, gdy istnieje relacja IS-A . Jeśli klasa nadrzędna może dodatkowo mieć bardziej szczegółowe typy podrzędne o różnych funkcjach, ale będzie miała wspólne elementy wyodrębnione w obiekcie nadrzędnym.
Kwestionuję to zrozumienie z powodu tego, co zaleca nam mój profesor Java. Zalecił, aby w przypadku JSwingaplikacji budowanej w klasie
Należy rozszerzyć wszystkich JSwingklas ( JFrame, JButton, JTextBox, etc) do oddzielnych klas niestandardowych i określić dostosowanie GUI powiązane w nich (podobnie jak wielkość składnika, etykiety komponentów, etc)
Jak dotąd jest tak dobry, ale dalej radzi, aby każdy JButton miał własną niestandardową rozszerzoną klasę, chociaż jedynym wyróżnikiem jest jej etykieta.
Na przykład jeśli GUI ma dwa przyciski OK i Anuluj . Zaleca przedłużenie ich jak poniżej:
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);
}
}
Jak widać jedyną różnicą jest setTextfunkcja.
Więc czy to standardowa praktyka?
Btw, kurs, w którym to omówiono, nazywa się Najlepszymi praktykami programowania w Javie
[Odpowiedź od prof]
Omówiłem więc problem z profesorem i podniosłem wszystkie punkty wymienione w odpowiedziach.
Jego uzasadnieniem jest to, że podklasa zapewnia kod wielokrotnego użytku przy zachowaniu standardów projektowania GUI. Na przykład, jeśli programista użył przycisków niestandardowych Okayi Cancelprzycisków w jednym oknie, łatwiej będzie umieścić te same przyciski również w innych oknach.
Wydaje mi się, że mam powód, ale wciąż wykorzystuje dziedziczenie i sprawia, że kod jest kruchy.
Później każdy programista mógł przypadkowo wywołać setTextna Okayprzycisk i zmienić go. W takim przypadku podklasa staje się po prostu uciążliwa.
JButtoni wywoływać metody publiczne w konstruktorze, skoro można po prostu utworzyćJButtoni wywołać te same metody publiczne poza klasą?