La mia attuale comprensione dell'implementazione dell'ereditarietà è che si dovrebbe estendere una classe solo se è presente una relazione IS-A . Se la classe genitore può inoltre avere tipi figlio più specifici con funzionalità diverse ma condividerà elementi comuni astratti nel genitore.
Sto mettendo in dubbio questa comprensione a causa di ciò che il mio professore Java ci sta raccomandando di fare. Ha raccomandato che per JSwing
un'applicazione stiamo costruendo in classe
Si dovrebbe estendere tutte le JSwing
classi ( JFrame
, JButton
, JTextBox
, ecc) in classi personalizzate separati e specificare la personalizzazione correlata GUI in loro (come la dimensione dei componenti, dell'etichetta del componente, ecc)
Fin qui tutto bene, ma continua a consigliare che ogni JButton dovrebbe avere la sua classe estesa personalizzata anche se l'unico fattore distintivo è la loro etichetta.
Ad esempio, se la GUI ha due pulsanti OK e Annulla . Si consiglia di estenderli come di seguito:
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);
}
}
Come puoi vedere, l'unica differenza è nella setText
funzione.
Quindi è questa pratica standard?
A proposito, il corso in cui questo è stato discusso si chiama Best Programming Practices in Java
[Risposta del Prof]
Quindi ho discusso il problema con il professore e ho sollevato tutti i punti citati nelle risposte.
La sua giustificazione è che la sottoclasse fornisce codice riutilizzabile seguendo gli standard di progettazione della GUI. Ad esempio, se lo sviluppatore ha utilizzato pulsanti personalizzati Okay
e Cancel
in una finestra, sarà più facile posizionare gli stessi pulsanti anche in altre finestre.
Presumo il motivo suppongo, ma sta ancora sfruttando l' eredità e rendendo fragile il codice.
In seguito, ogni sviluppatore potrebbe accidentalmente chiamare il setText
su un Okay
tasto e di modificarlo. La sottoclasse diventa solo fastidio in quel caso.
JButton
e chiamare metodi pubblici nel suo costruttore, quando puoi semplicemente creareJButton
e chiamare quegli stessi metodi pubblici al di fuori della classe?