web-dev-qa-db-fra.com

Quelle est la composition en ce qui concerne la conception orientée objet?

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?

62
DaveDev

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".

40
Cylon Cat

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.

20
Carl Manaster
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 .

17
Zaki

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.

5
Iain Ward