Skip to content

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.

5-1-objekt-1

Objektbeziehungen im UML-Diagramm

Es gibt zwei Möglichkeiten, im UML-Diagramm Objektbeziehungen darzustellen:

  1. 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.
5-1-objekt-1
  1. 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.
5-1-objekt-2

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.

Möglichkeit 1 zur Darstellung im UML-Diagramm
Möglichkeit 1 zur Darstellung im UML-Diagramm
Möglichkeit 2 zur Darstellung im UML-Diagramm
Möglichkeit 2 zur Darstellung im UML-Diagramm

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.

Baelle fangen

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.

5-1-uml-baelle-markiert

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:

  1. Wenn der Konstruktor vom Ball aufgerufen wird, wird ein SGLeinwand-Objekt als Parameter übergeben. Diese Referenz wird dann im Attribut lw gespeichert. Über das Attribut lw kann das Ball-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;
	...
}   
            
                    
        
  1. In der Klasse Ball wird eine zusätzliche Methode lerneSpielerKennen implementiert. Diese ist sozusagen ein Setter für das Attribut box. Beim Aufruf wird also ein SGRechteck-Objekt übergeben, das dann im Attribut box 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

  1. Kommentiere den Quelltext zum Projekt Bälle fangen zeilenweise.
  2. Ersetze in der Klasse Ball im Konstruktor die Anweisung
    kenntLeinwand = 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 zu kenntLeinwand = pLeinwand;
  3. 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.