Di solito preferisco seguire la regola "composition over inheritance", fino a quando non comincio ad entrare nel mondo della GUI Java.
Nella mia esperienza, per aggiungere requisiti personalizzati in un componente della GUI, ad esempio, aggiungere una funzione personalizzata in un JButton, di solito creare una classe che si estende da JButton in questo modo:
public class CustomButton extends JButton{
public void customMethod(){
}
}
Penso che stia ovviamente violando la regola "composizione sull'ereditarietà", quindi cerco di ottenerla per composizione invece che per ereditarietà, ma il problema si verifica: JButton ha muri di metodi, se uso la composizione, sono necessari muri di mappatura dei metodi in la mia classe CustomButton:
public class CustomButton{
protected JButton button;
public void customMethod(){
}
public void add(PopupMenu popup){
button.add(popup);
}
public void addActionListener(ActionListener l){
button.addActionListener(l);
}
.
.
.
}
che potrebbe richiedere un orribile elenco di metodi da associare a JButton.
C'è anche un altro problema: non so come gestire i metodi built-in che richiedono JButton come parametri se il mio CustomButton non è la sottoclasse di JButton.
Quindi la mia domanda è, se la classe originale ha troppi metodi, è ragionevole usare l'ereditarietà invece della composizione?