Secondo Perché dovrei preferire la composizione all'ereditarietà? , Preferirei la composizione sull'ereditarietà. Ma cosa succede se ho bisogno di accedere all'interfaccia e al membro della classe in modo generico? Ad esempio, ho la classe genitore Shape e alcune classi child:
public class Shape{
private String customId;
public String getCustomId(){
return customId;
}
public void setCustomId(String aCustomId){
customId=aCustomId;
}
public abstract void draw();
}
public class Circle extends Shape{
@Override
public void draw(){
}
}
Alcuni codici per utilizzare l'interfaccia Shape
for(Shape s : shapeArray){
s.draw();
//access customId
if(s.getCustomId().equals(...)){
}
}
...
public class User{
private Shape shape;
public void printInfo(){
System.out.println("User Shape id:"+shape.getCustomId());
}
}
Ma sta violando la composizione sull'ereditarietà, quindi cambio l'ereditarietà in composition + interface:
public interface Shape{
String getCustomId();
void setCustomId(String aCustomId);
void draw();
}
public class Circle implements Shape{
private String customId;
public String getCustomId(){
return customId;
}
public void setCustomId(String aCustomId){
customId=aCustomId;
}
public void draw(){
}
}
Ho trovato che la composizione è più non gestibile in questo caso perché:
-
quando aggiungo una nuova classe, devo copiare e incollare
private String customId; public String getCustomId(){ return customId; } public void setCustomId(String aCustomId){ customId=aCustomId; }
-
Se ho bisogno di aggiungere un nuovo membro della classe figlio a Shape, devo anche modificare tutte le classi child per aggiungere il membro della classe e anche getter e setter al suo interno
Quindi la mia domanda è: ho bisogno di "composizione sull'ereditarietà" se devo accedere sia al membro della classe che ai metodi in modo generico?