5.1 Objektbeziehungen
Im letzten Kapitel wurden eigene Klassen programmiert und verwendet. Dabei haben wir bereits intuitiv Objektbeziehungen, sogenannte Assoziationen, genutzt. Von einer (gerichteten) Assoziation spricht man, wenn in einer Klasse A
ein Attribut existiert, dessen Datentyp eine andere Klasse B
ist. Das heißt: Ein Objekt der Klasse A
verfügt über ein Objekt der Klasse B
als Attribut mit dem Namen beispiel
.
Im vergangenen Kapitel verfügte beispielsweise die Ampelkreuzung
über mehrere Objekte der Klasse Ampel
und ein Objekt der Klasse Buchregal
über mehrere Objekte der Klasse Buch
.

Objektbeziehungen im UML-Diagramm
Es gibt zwei Möglichkeiten, im UML-Diagramm Objektbeziehungen darzustellen:
- Es wird ein Assoziationspfeil zwischen den beiden Klassen gezeichnet, der auf die Klasse (B) zeigt, die in der anderen Klasse (A) benutzt wird. Oberhalb des Pfeils wird der Objektname (
beispiel
) mit der vorgesehenen Sichtbarkeit eingetragen. Bei dieser Möglichkeit wird die Objektbeziehung über den Pfeil besonders sichtbar.

- Bei den Attributen der einen Klasse wird die andere Klasse mit der vorgesehenen Sichtbarkeit eingetragen. Mit dieser Möglichkeit bleibt ein UML-Diagramm auch übersichtlich, wenn es viele Objektbeziehungen gibt.

Arten von Assoziationen
Es kann zwischen verschiedenen Arten von Assoziationen unterschieden werden. Es ist hilfreich, sich frühzeitig über die Art der Objektbeziehung Gedanken zu machen. Das erleichtert später die Implementation.
Hat/Benutzt-Beziehung
Bei einer Hat-Beziehung hat die KlasseA
ein Objekt der KlasseB
. Diese Art der Assoziation wurde bereits seit dem ersten Programm genutzt: Eine Landschaft hat ein SGLeinwand
-Objekt mit dem Namen meineLeinwand
, ein SGRechteck
-Objekt mit dem Namen boden
und ein SGKreis
-Objekt mit dem Namen sonne
.
Bei einer Hat-Beziehung wird das benutzte Objekt in der Klasse erzeugt, die das Objekt benutzt, meist schon im Konstruktor. Wie üblich wird hierfür der new
-Operator benutzt.


Kennt-Beziehung
Bei einer Kennt-Beziehung kennt die KlasseA
ein Objekt der KlasseB
. Diese Art der Assoziation ist neu, weil das Objekt der KlasseB
, das in KlasseA
gespeichert wird, auch unabhängig davon existieren kann.
Im folgenden Projekt wird eine Klasse Ball
programmiert, wobei ein Ball gefangen werden kann, wenn er von einem Rechteck (demfaenger
) umschlossen wird. Der Spieler kann diesen Fänger steuern.
Die Beschreibung zeigt schon, dass der faenger
unabhängig vom Ball existieren kann. Alle Bälle beziehen sich ja auf den gleichen Fänger und müssen überprüfen, ob sie sich in diesem Rechteck befinden. Daher macht es Sinn, dass ein Ball den faenger
kennt, um festzustellen, ob er gefangen wurde.

Die nebenstehende Grafik zeigt das UML-Diagramm zum Projekt Bälle fangen. Blau unterlegt sind die Objektbeziehungen zwischen den Klassen.
Aufgabe: Unterscheide, welche der Objektbeziehungen HAT-Beziehungen und welche KENNT-Beziehungen sind.

Anders als HAT-Beziehungen werden KENNT-Beziehungen nicht durch das Erstellen eines Objekts mit dem Aufruf des new
-Operators erstellt. Das Objekt existiert ja bereits und soll lediglich von einem anderen Objekt kennengelernt werden. Dazu gibt es zwei Möglichkeiten, die am Beispiel des Projekts Bälle fangen gezeigt werden sollen:
- Wenn der Konstruktor vom
Ball
aufgerufen wird, wird einSGLeinwand
-Objekt als Parameter übergeben. Diese Referenz wird dann im Attributlw
gespeichert. Über das Attributlw
kann dasBall
-Objekt nun auf die Leinwand zugreifen und beispielsweise beim Bewegen darauf achten, dass er nicht aus dem Bild fliegt.
In der Klasse Anwendung
public Anwendung() {
meineLeinwand = new SGLeinwand(800,600);
...
for(int i = 0; i < baelle.length; i++ ) {
baelle[i] = new Ball(meineLeinwand);
}
}
In der Klasse Ball
public Ball(SGLeinwand pLeinwand) {
lw = pLeinwand;
...
}
- In der Klasse
Ball
wird eine zusätzliche MethodelerneSpielerKennen
implementiert. Diese ist sozusagen ein Setter für das Attributbox
. Beim Aufruf wird also einSGRechteck
-Objekt übergeben, das dann im Attributbox
gespeichert wird. Damit hat das Ball-Objekt Zugriff auf das Spieler-Rechteck und kann beispielsweise überprüfen, ob es gefangen wurde.
In der Klasse Anwendung
public Anwendung() {
...
spieler = new SGRechteck(50,50,40,40);
...
for(int i = 0; i < baelle.length; i++ ) {
...
baelle[i].lerneSpielerKennen(spieler);
}
}
In der Klasse Ball
public void lerneSpielerKennen(SGRechteck pBox) {
box = pBox;
}
Aufgaben
- Kommentiere den Quelltext zum Projekt Bälle fangen zeilenweise.
- Ersetze in der Klasse
Ball
im Konstruktor die AnweisungkenntLeinwand = pLeinwand;
durch die Anweisung
kenntLeinwand = new SGLeinwand(800,600);
Führe das Programm dann aus und beschreibe die Änderung mit den Begriffen KENNT- und HAT-Beziehung.
Ändere die Anweisung im Konstruktor im Anschluss wieder zukenntLeinwand = pLeinwand;
- Erstellt in einer Gruppe eine Präsentation, die das Thema „Objektbeziehungen“ erklärt. Die Art der Präsentation (Vortrag mit Folien, Erklärvideo, …) könnt ihr selbst wählen.