Devo forzare la regola "composizione sull'ereditarietà" ai membri della classe?

0

Come noto, secondo la regola "composizione sull'ereditarietà", dovremmo evitare di riutilizzare un metodo per ereditarietà, ma per quanto riguarda i membri della classe? Supponiamo che io abbia classi genitore e figlio come la seguente:

public class Animal{
    protected String name;
    protected int _id;
    public String getName(){
        return name;
    }
    public int getId(){
        return _id;
    }
}

public class Cat extends Animal{
}

public class Dog extends Animal{
}

e ho scoperto che sto riutilizzando il campo "name" e "_id" per ereditarietà. Dovrei mettere tutti gli attributi in una classe separata e lasciare che una classe figlia lo usi per composizione in questo modo:

public class AnimalData{
    public String name;
    public int _id;
}

public interface Animal{
    public AnimalData getAnimalData();
}

public class Cat implements Animal{
    public AnimalData animalData;
    public AnimalData getAnimalData(){
        return animalData;
    }
} 

public class Dog implements Animal{
    public AnimalData animalData;
    public AnimalData getAnimalData(){
        return animalData;
    }
} 

per obbedire alla regola "composizione sull'ereditarietà"?

    
posta ggrr 22.06.2016 - 09:55
fonte

1 risposta

5

Non c'è niente di sbagliato nell'ereditarietà e nel tuo caso è chiaramente la soluzione più semplice. La seconda soluzione introduce complessità senza alcun beneficio. "La composizione sull'ereditarietà" è solo una regola empirica per evitare un'eccessiva fiducia nell'ereditarietà - non dice che non si dovrebbe usare l'ereditarietà quando è appropriato.

Inoltre, non stai nemmeno riducendo la quantità di ereditarietà nel secondo esempio. La domanda è se hai bisogno delle sottoclassi "Gatto" e "Cane". È più facile vedere se usi un esempio più realistico. Di 'che hai un pulsante. Ti rendi conto che alcune istanze di Button avranno una finestra popup-help e altre no. Dovresti creare una sottoclasse di ButtonWithPopupHelp che aggiunge la funzionalità relativa ai popup, o dovresti piuttosto creare una classe separata PopupHelp , che contiene la funzionalità specifica per i popup e che può essere collegata al pulsante e forse ad altri controlli? Se possibile, è preferibile la seconda opzione.

    
risposta data 22.06.2016 - 10:49
fonte