J'entends (et lis sur ce site) beaucoup de choses sur "privilégier la composition à l'héritage".
Mais qu'est-ce que Compositon? Je comprends l'héritage du point de vue Personne: Mammifère: Animal, mais je ne vois vraiment pas la définition de Compostion n'importe où. Quelqu'un peut-il me renseigner?
La composition fait référence à la combinaison de types simples pour en créer des plus complexes. Dans votre exemple, la composition pourrait être:
Animal:
Skin animalSkin
Organs animalOrgans
Mammal::Animal:
Hair/fur mammalFur
warm-blooded-based_cirulation_system heartAndStuff
Person::Mammal:
string firstName
string lastName
Si vous vouliez aller totalement à la composition (et vous débarrasser de tout héritage), cela ressemblerait à ceci:
Animal:
Skin animalSkin
Organs animalOrgans
Mammal:
private Animal _animalRef
Hair/fur mammalFur
warm-blooded-based_cirulation_system heartAndStuff
Person:
private Mammal _mammalRef
string firstName
string lastName
L'avantage de cette approche est que les types Mammal
et Person
n'ont pas à se conformer à l'interface de leur parent précédent. Cela pourrait être une bonne chose car parfois une modification de la superclasse peut avoir des effets graves sur les sous-classes. Ils peuvent toujours avoir accès aux propriétés et aux comportements de ces classes via leurs instances privées de ces classes, et s'ils souhaitent exposer ces anciens comportements de superclasse, ils peuvent simplement les encapsuler dans une méthode publique.
J'ai trouvé un bon lien avec de bons exemples ici: http://www.artima.com/designtechniques/compoinh.html
La composition est simplement les parties qui composent l'ensemble. Une voiture a des roues, un moteur et des sièges. L'héritage est une relation "est une". La composition est une relation "a une".
Il existe trois façons de donner un comportement à une classe. Vous pouvez écrire ce comportement dans la classe; vous pouvez hériter d'une classe qui a le comportement souhaité; ou vous pouvez incorporer une classe avec le comportement souhaité dans votre classe en tant que champ ou variable membre. Les deux derniers représentent des formes de réutilisation de code, et le dernier - la composition - est généralement préféré. Cela ne donne pas réellement à votre classe le comportement souhaité - vous devez toujours appeler la méthode sur le terrain - mais cela met moins de contraintes sur la conception de votre classe et les résultats sont plus faciles à tester et à déboguer du code. L'hérédité a sa place, mais la composition doit être préférée.
class Engine
{
}
class Automobile
{
}
class Car extends Automobile // car "is a" automobile //inheritance here
{
Engine engine; // car "has a" engine //composition here
}
Composition - La fonctionnalité d'un objet est constituée d'un agrégat de classes différentes. En pratique, cela signifie tenir un pointeur vers une autre classe à laquelle le travail est reporté.
Héritage - La fonctionnalité d'un objet est constituée de sa propre fonctionnalité plus la fonctionnalité de ses classes parentes.
Quant à savoir pourquoi la composition est préférée à l'héritage, jetez un œil au problème cercle-ellipse .
Un exemple de composition est l'endroit où vous avez une instance d'une classe dans une autre classe, au lieu d'en hériter
This page a un bon article expliquant pourquoi les gens disent "privilégier la composition à l'héritage" avec quelques exemples de pourquoi.