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 JSwing
aplikacji budowanej w klasie
Należy rozszerzyć wszystkich JSwing
klas ( 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 setText
funkcja.
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 Okay
i Cancel
przyciskó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ć setText
na Okay
przycisk i zmienić go. W takim przypadku podklasa staje się po prostu uciążliwa.
JButton
i wywoływać metody publiczne w konstruktorze, skoro można po prostu utworzyćJButton
i wywołać te same metody publiczne poza klasą?