Aggrégation vs. composition en programmation orientée objet
En programmation orientée objet, il existe de nombreux types de relations qui peuvent exister entre deux ou plusieurs classes. Les deux types les plus courants sont :
- Héritage – une relation » est une »
- Association – une relation » a une »
Ce blog va faire une plongée profonde dans les deux types de relations d’association – Agrégation et Composition.
Une relation d’association entre deux classes est une relation » a une « . Par exemple :
- Un
Car
a unEngine
et unWheel
- Un
Person
a unLeg
. et unArm
- A
Book
aPages
Cela représente généralement quand il y a deux classes, ClassA
et ClassB
, et soit :
-
ClassA
contientClassB
comme attribut, ou - Des instances de
ClassB
sont construites à l’intérieur deClassA
Quelle est la différence entre l’agrégation et la composition ?
Il existe deux sous-types de relations d’association : l’agrégation et la composition. Quelle est la différence entre les deux ?
Composition
La composition implique que la classe contenue ne peut pas exister indépendamment du conteneur. Si le conteneur est détruit, l’enfant l’est aussi.
Prenez par exemple un Page
et un Book
. La Page
ne peut exister sans la Book
, car le livre est composé de Pages
. Si la Book
est détruite, la Page
est également détruite.
Dans le code, cela fait généralement référence à l’instance enfant créée à l’intérieur de la classe conteneur :
class Book:
def __init__(self):
page1 = Page('This is content for page 1')
page2 = Page('This is content for page 2')
self.pages =
class Page:
def __init__(self, content):
self.content = contentbook = Book() # If I destroy this Book instance,
# the Page instances are also destroyed
Agrégation
Avec une agrégation, l’enfant peut exister indépendamment du parent.
Alors, en pensant à un Car
et à un Engine
, le Engine
n’a pas besoin d’être détruit lorsque le Car
est détruit.
class Car:
def __init__(self, engine):
self.engine = engine
class Engine:
def __init__(self):
passengine = Engine()
car = Car(engine) # If I destroy this Car instance,
# the Engine instance still exists
Comment sont-elles représentées un diagramme UML ?
Dans un diagramme UML, l’agrégation et la composition sont toutes deux représentées par une flèche en losange entre les classes. L’extrémité du losange va sur le côté du conteneur.
- L’agrégation utilise un losange ouvert
- La composition utilise un losange fermé
Voici un exemple :