Articles

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 ein Engine und ein Wheel
  • Ein Person hat ein Leg und ein Arm
  • Ein Book hat ein Pages

Dies ist normalerweise der Fall, wenn es zwei Klassen gibt, ClassA und ClassB, und entweder:

  • ClassA enthält als Attribut ClassB, oder
  • Instanzen von ClassB werden innerhalb von ClassA 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!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.