Aggregation vs. Komposition in der objektorientierten Programmierung
In der objektorientierten Programmierung gibt es viele verschiedene Arten von Beziehungen, die zwischen zwei oder mehr Klassen bestehen können. Die zwei häufigsten Typen sind:
- Vererbung – eine „ist ein“-Beziehung
- Assoziation – eine „hat ein“-Beziehung
In diesem Blog werden wir uns mit den zwei Typen von Assoziationsbeziehungen beschäftigen – Aggregation und Komposition.
Eine Assoziationsbeziehung zwischen zwei Klassen ist eine „hat ein“-Beziehung. Ein Beispiel:
- Ein
Carhat einEngineund einWheel - Ein
Personhat einLegund einArm - Ein
Bookhat einPages
Dies ist normalerweise der Fall, wenn es zwei Klassen gibt, ClassA und ClassB, und entweder:
-
ClassAenthält als AttributClassB, oder - Instanzen von
ClassBwerden innerhalb vonClassAaufgebaut
Was ist der Unterschied zwischen Aggregation und Komposition?
Es gibt zwei Untertypen von Assoziationsbeziehungen – Aggregation und Komposition. Was ist der Unterschied zwischen diesen beiden?
Komposition
Komposition impliziert, dass die enthaltene Klasse nicht unabhängig vom Container existieren kann. Wenn der Container zerstört wird, wird auch das Kind zerstört.
Nehmen wir zum Beispiel ein Page und ein Book. Das Page kann nicht ohne das Book existieren, weil das Buch aus Pages besteht. Wenn das Book zerstört wird, wird auch das Page zerstört.
Im Code ist damit meist gemeint, dass die Child-Instanz innerhalb der Container-Klasse erzeugt wird:
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
Aggregation
Bei einer Aggregation kann das Child unabhängig vom Parent existieren.
Denken Sie also an ein Car und ein Engine, muss das Engine nicht zerstört werden, wenn das Car zerstört wird.
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
Wie werden diese in einem UML-Diagramm dargestellt?
In einem UML-Diagramm werden sowohl Aggregation als auch Komposition mit einem Rautenpfeil zwischen den Klassen dargestellt. Das Ende der Raute befindet sich an der Seite des Containers.
- Aggregation verwendet eine offene Raute
- Komposition verwendet eine geschlossene Raute
Hier ist ein Beispiel:

Hoffe das hat geholfen!