Ho una gerarchia di classi come questa Beverage -> Coffee-> Latte
. Dove è la superclasse abstract
estesa da Coffee
. La classe Coffee
aggiunge un po 'di comportamento ma è anche abstract
. Latte
estende la classe Coffee
ed è una classe concreta. Ho usato l'ereditarietà per aggiungere comportamenti qui. E l'ereditarietà ha degli inconvenienti come la visibilità dei metodi della superclasse, rendendo il codice fragile, il codice è strettamente accoppiato. Quindi, i principi di programmazione dettano Composition
dovrebbero essere preferiti su Inheritance
. Ma in questo casoLatte
è un tipo di Coffee
e Coffee
è un tipo di Beverage
che utilizzando composition
per aggiungere il comportamento si sente sbagliato nonostante i suoi vantaggi. Quindi la domanda qui è L'intuizione dovrebbe prevalere sui principi di progettazione?Intuizione vs principi di progettazione
bevande:
public abstract class Beverage {
private final String name;
private final double price;
Beverage(String name, double price){
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
public abstract void make();
}
caffè:
public abstract class Coffee extends Beverage {
public Coffee(String name, double price) {
super(name, price);
}
public final void make(){
grindBeans();
takeShot();
frothMilk();
addCondiments();
}
public void grindBeans(){
System.out.println("Grinding Beans...");
}
public void takeShot(){
System.out.println("Taking Shot....");
}
public abstract void frothMilk();
public abstract void addCondiments();
}
Latte:
public class Latte extends Coffee {
public Latte() {
super("Latte", 4.0);
}
@Override
public void frothMilk() {
System.out.println("Frothing milk to create micro foam");
}
@Override
public void addCondiments() {
// TODO Auto-generated method stub
}
}
EDIT: Aggiunta Sugar
alla struttura esistente. Viene mostrato solo il nuovo codice.
public abstract class Beverage {
private Sugar sugar;
public Sugar getSugar() {
return sugar;
}
public void setSugar(Sugar sugar) {
this.sugar = sugar;
}
}
Caffè:
public abstract class Coffee extends Beverage {
public final void make(){
grindBeans();
takeShot();
frothMilk();
addSugar();
addCondiments();
}
public void addSugar(){
Sugar sugar = super.getSugar();
if(!(sugar instanceof NoSugar)){
System.out.println("adding " + sugar.getTeaspoon() + " teaspoon sugar");
}
}
possibile duplicato di [Preferisci composizione su ereditarietà?] (Http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance) – jaco0646
Questa domanda richiede un parere sull'intuizione rispetto ai principi di progettazione. – lit