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
Car
hat einEngine
und einWheel
- Ein
Person
hat einLeg
und einArm
- Ein
Book
hat einPages
Dies ist normalerweise der Fall, wenn es zwei Klassen gibt, ClassA
und ClassB
, und entweder:
-
ClassA
enthält als AttributClassB
, oder - Instanzen von
ClassB
werden innerhalb vonClassA
aufgebaut
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!