Attualmente sto leggendo "Testa i primi schemi di progettazione" e ho già alcune domande sul primo capitolo del libro. Questo capitolo introduce il principio di progettazione "preferisci la composizione sull'ereditarietà", spiegando il "modello strategico". La mia domanda non riguarda il modello, ma piuttosto una decisione di progettazione più basilare in uno degli esempi:
Esiste una classe Duck
astratta, da cui eredita una mano piena di altre classi duck (ad esempio "Rubber-" o "Redhead-Duck"). Tutte queste anatre hanno un metodo display
e quack
.
Il metodo display
è ciò che dovrebbe essere diverso in ogni classe speciale di anatra (perché ogni anatra ha un aspetto diverso, come dice il libro).
abstract class Duck
{
public void display();
public void quack()
{
//Quack here
}
}
class RubberDuck extends Duck
{
@Override
public void display()
{
//Display a 'Rubber-Duck'
}
}
class RedheadDuck extends Duck
{
@Override
public void display()
{
//Display a 'Redhead-Duck'
}
}
Ma la mia domanda è: non avrebbe molto più senso avere un campo all'interno di una classe Duck (non astratta), che contenga le informazioni di visualizzazione (un'immagine o un modello 3D per esempio) piuttosto che ereditare da una lezione di anatra astratta?
class Duck
{
private String duckName;
private Picture duckPicture;
public Duck(String name, Picture picture)
{
this.duckName = name;
this.duckPicture = picture;
}
public void quack()
{
//Quack here
}
public void display()
{
//Show duck here, according to the 'duckPicture' field
}
//More methods here, maybe a getter for the 'duckName' field
}
Qual è la tua opinione su questo? Ha senso avere una classe di anatra astratta ed ereditarla o preferisci la seconda soluzione?