====== Aggregation/Komposition ======
Im letzten Projekt "Hunter" enthielt die ''Huntergame''-Klasse die Attribute ''hunter'' und ''target'' vom Datentyp ''Circle'' sowie das Attribut ''enemies'' vom Datentyp Group. Diese Attribute speichern Referenzen ("Zeiger") auf entsprechende Circle- bzw. Group-Objekte:
class HunterGame extends Actor {
Circle hunter;
Circle target;
Group enemies = new Group();
usw...
}
Man sagt: "Ein Huntergame-Objekt enthält zwei Circle-Objekte und ein Group-Objekt" und stellt dies im Klassendiagramm folgendermaßen dar:
{{ :diagrams:diagrams:aggregation:pasted:20210228-180734.png?600 }}
Die **Kardinalitäten** 1:1 bzw. 1:2 sind genauso definiert wie zwischen Datenbanktabellen.
**Aggregation und Komposition** \\ \\
Steht ein Objekt mit anderen Objekten in Beziehung (insbesondere in einer "enthält"-Beziehung), so spricht man von **Aggregation**. Im Klassendiagramm veranschaulicht man dies als Verbindungs"pfeil" mit einer unausgefüllten Raute als Spitze. Die Raute zeigt auf die Klasse, deren Objekte die anderen Objekte enthalten. \\ \\
Falls ein Objekt andere Objekte nicht nur **enthält**, sondern sogar aus diesen Objekten **besteht**, d.h. in seiner Existenz von ihnen abhängt, so spricht man von einer **Komposition**. Im Unterschied zur Aggregation wird in diesem Fall die Raute schwarz gefüllt. Besteht ein Objekt der Klasse ''Rakete'' beispielsweise aus einem Objekt der Klasse Rectangle (dem Raketenrumpf) und einem Objekt der Klasse Triangle (der Spitze), so sieht das Klassendiagramm folgendermaßen aus:
{{ :diagrams:diagrams:aggregation:pasted:20210228-181514.png?400 }}
Die Unterscheidung zwischen Aggregation und Komposition ist oft sehr fein, im Grunde genommen hat sie aber wenig Auswirkungen, da beide Relationen **programmtechnisch identisch umgesetzt** werden: \\ \\
Die Klasse, deren Objekte die anderen Objekte enthalten, bekommt **entsprechende Attribute**. Im Falle der Rakete:
class Rakete {
Rectangle rumpf;
Triangle spitze;
usw...
}
===== Beispiel 1: =====
Folgende Klassen sind gegeben. Zeichne das Klassendiagramm (ohne Attribute und Methoden)! \\ \\
Lösung: Siehe Bild rechts.
{{ :diagrams:diagrams:aggregation:pasted:20210228-203121.png?400}}
class Bibliothek {
Buch[] bücher;
Person leiterin;
}
class Buch {
String titel;
String autor;
}
class Person {
String name;
String anschrift;
}
===== Beispiel 2: =====
Schreibe die Java-Klassen (ohne Methoden) zu folgendem Klassendiagramm:
Lösung: Siehe rechts.
{{:diagrams:diagrams:aggregation:pasted:20210228-203927.png?400 }}
class PongSpiel {
Ball ball;
Schläger schlägerLinks;
Schläger schlägerRechts;
}
class Ball extends Circle {
}
class Schläger extends Rectangle {
}
===== Aufgabe 1 =====
Zeichne das Klassendiagramm (ohne Methoden) zu folgendem Programm:
class Autospiel extends Actor {
Auto spieler1;
Auto spieler2;
}
class Auto {
Karosserie karosserie;
Rad radVorne;
Rad radHinten;
}
class Karosserie extends Rectangle {
}
class Rad extends Circle {
}
[[.aufgabe1:loesung:start|Lösung]]
===== Aufgabe 2 =====
Schreibe die Java-Klassen (ohne Methoden) zu folgendem Klassendiagramm:
{{:diagrams:diagrams:aggregation:pasted:20210228-205533.png?400}}
[[.aufgabe2:loesung:start|Lösung]]