4.1 Beziehungen zwischen Klassen

Eine objektorientierte Software besteht aus verschiedenen Objekten, die gemeinsam die an das Programm gestellten Anforderungen erfüllen. Dazu nutzen Objekte häufig Funktionalitäten – in der Regel Methoden – anderer Objekte.

Um ein anderes Objekt ansprechen zu können, merkt sich ein Objekt dessen Adresse mit Hilfe eines Attributs. Als Attributtyp wird die Klasse des anderen Objekts festgelegt. Mit Hilfe des Attributnamens kann das andere Objekt dann angesprochen werden.

4.1.1 Darstellung von Beziehungen im UML-Klassendiagramm

Jedes Attribut, dessen Typ wiederum eine Klasse ist, erlaubt den Kontakt zu einem entsprechenden Objekt. Im Klassendiagramm wird eine solche Beziehung durch eine Linie veranschaulicht, die die beteiligten Klassen verbindet. Die UML bezeichnet diese Beziehung als Assoziation. Die Objekte der verbundenen Klassen kommunizieren über diese Assoziation miteinander. Eine offene Pfeilspitze (>) an einem oder beiden Enden der Verbindungslinie gibt die Zugriffsrichtung (Navigationsrichtung) an. Objekte der Klasse am jeweils anderen Ende dürfen dann auf Objekte der Klasse, auf die die Pfeilspitze zeigt, zugreifen. Ein Kreuz (X) schließt den Zugriff auf Objekte der entsprechenden Seite durch Objekte der anderen Seite explizit aus.

Beispiel
UML-Klassendiagramm: Assoziationen
Abb. 4-1: UML-Klassendiagramm: Die Assoziationen steuert und bewegt sich auf

Ein Szenario-Objekt besitzt das Attribut robi, dem die Adresse eines Objekts der Klasse Roboter zugewiesen werden kann. Das Szenario-Objekt kann dieses Roboter-Objekt dann mit Hilfe des Attributnamens robi ansprechen und durch den Aufruf entsprechender öffentlicher Methoden steuern.

Ein Roboter-Objekt besitzt das Attribut spielbrett, dem die Adresse eines Objekts der Klasse Spielbrett zugewiesen werden kann. Umgekehrt besitzt ein Spielbrett-Objekt das Attribut roboter, dem die Adresse eines Objekts der Klasse Roboter zugewiesen werden kann. In diesem Fall können also beide Objekte das jeweils andere ansprechen.

Besitzt eine Klasse ein Attribut, dem ein Objekt einer anderen Klasse zugewiesen werden kann, besteht zwischen den beiden Klassen eine Beziehung, die in der UML Assoziation genannt wird. Assoziationen erlauben es den Objekten der verbundenen Klassen Kontakt aufzunehmen und miteinander zu kommunizieren.

Es ist sinnvoll, eine Assoziation mit einem Namen zu versehen. So wird deutlich, welcher Art die Beziehung zwischen den beteiligten Klassen ist. Ein kleines ausgefülltes Dreieck (►) gibt dabei die Leserichtung vor.

Merke: Assoziation

Befindet sich am Ende der Linie einer Assoziation eine offene Pfeilspitze (>), zeigt dies, dass ein Objekt der Klasse, auf die die Pfeilspitze zeigt, von einem Objekt der Klasse am anderen Ende der Linie angesprochen werden kann. Ein Kreuz (X) macht hingegen deutlich, dass dies nicht möglich ist.

Befindet sich an beiden Enden einer Assoziation eine offene Pfeilspitze, handelt es sich um eine zweiseitige (bidirektionale) Assoziation. Ist an einem Ende ein Kreuz und am anderen eine offene Pfeilspitze, liegt eine einseitige (unidirektionale) Assoziation vor. Ist an einem Ende weder eine Pfeilspitze noch ein Kreuz eingezeichnet, gilt die Assoziation als ungerichtet. Über ihre Richtung muss noch entschieden werden.

Merke: Zugriffsrichtung (Navigierbarkeit)

4.1.2 Unidirektionale vs. bidirektionale Assoziation

Welche Art von Assoziation in einem Modell gewählt wird, hängt von den jeweiligen Anforderungen ab.

Beispiel
  1. Von einem Versicherungsvertrag ausgehend soll es möglich sein, direkt auf das versicherte Auto zuzugreifen.

    Falls dennoch die Frage aufkommt, welcher Versicherungsvertrag zu einem bestimmten Auto gehört, muss bei jedem einzelnen Versicherungsvertrag geprüft werden, ob diesem das jeweilige Auto zugeordnet ist. Die Suche endet bei einem Treffer oder wenn alle Autos überprüft sind.

    Abb. 4-2: UML-Klassendiagramm: Assoziation (Beispiel a)
  2. Von einem Auto ausgehend soll es möglich sein, direkt auf den jeweiligen Versicherungsvertrag zuzugreifen.

    Falls dennoch die Frage aufkommt, welches Auto zu einem bestimmten Versicherungsvertrag gehört, muss bei jedem einzelnen Auto geprüft werden, ob diesem der jeweilige Versicherungsvertrag zugeordnet ist. Die Suche endet bei einem Treffer oder wenn alle Versicherungsverträge überprüft sind.

    Abb. 4-3: UML-Klassendiagramm: Assoziation (Beispiel b)
  3. Die in Teilaufgabe a) und b) genannten Anforderungen sollen beide möglich sein.

    Abb. 4-4: UML-Klassendiagramm: Assoziation (Beispiel c)
Frage

Frage 4-1: Initialisierung von Attributen

Welche Änderung müsste am Programm JavaRobot vorgenommen werden, damit ein Roboter auch das Szenario kennt, in dem er eingesetzt wird? Lösung

Assoziation zwischen den Klassen Szenario und Roboter
Abb. 4-5: UML-Klassendiagramm: Assoziation zwischen den Klassen Szenario und Roboter
Antwort:

Soll ein Roboter das Szenario, in dem er eingesetzt wird, kennen, benötigt er ein entsprechendes Attribut. Aus der bisher einseitigen wird eine zweiseitige Beziehung.

Nachdem ein Szenario-Objekt einen neuen Roboter erzeugt hat, muss es ihm nun mitteilen, „ich – this – bin das Szenario, in dem du eingesetzt bist“. Dazu muss die Klasse Roboter eine entsprechende öffentliche Methode – setSzenario(pSzenario:Szenario) – bereitstellen. Als Argument übergibt das Szenario-Objekt den Wert this. Dieser Platzhalter verweist immer auf das Objekt, das die entsprechende Anweisung gibt, in diesem Fall das Szenario-Objekt.

JAVA
public class Szenario {

    private Roboter robi;

    public void erstelleRobi(Spielbrett pSpielbrett){
        robi = new Roboter();
        robi.setSzenario(this);
        ...
    }

    ...

}