Zur Hauptnavigation springen [Alt]+[0] Zum Seiteninhalt springen [Alt]+[1]

Beziehungen

Man unterscheidet im Wesentlichen zwischen folgenden Beziehungen:

  • Vererbung (Beziehung zwischen Klassen) : Ein CrtBildschirm ist ein Bildschirm

  • Aggregation (Beziehungen zwischen Objekten): Ein Fernseher hat einen Bildschirm

  • Assoziation (Beziehung zwischen Objekten): Eine Fernbedienung kennt einen Fernseher

Vererbung (Spezialsierung / Generalisierung)

Mit dieser Beziehung haben wir uns im letzten Abschnitt schon beschäftigt. Hier nochmals in Kurzform: Der Ambilight-Bildschirm ist ein (spezieller) Bildschirm. Somit besitzt (erbt) er alle Attribute und Methoden von der Klasse Bildschirm. Die Klasse Bildschirm ist eine Verallgemeinerung (Generalisierung) der Klasse Ambilight-Bildschirm. Da die Klasse Bildschirm abstrakt ist, Ambilight-Bildschirm aber nicht, muss in der abgeleiteten Klasse die Methode getTyp() festgelegt werden. In ihr kann es aber auch neue Attribute (hier: umgebungslicht) und Methoden geben. Mit dem Begriff „Vererbung“ wird also eine Strukturbeziehung zwischen Klassen bezeichnet.

Wenn man den Beziehungs-Pfeil per Kontextmenü einfügt, hat das leider keine Konsequenzen für den Quellcode, der dann ja in der Klassenbezeichnung so aussehen sollte (siehe oben):

public class AmbilightBildschirm extends Bildschirm

Aggregation

Die konkrete Bildröhre ist Teil des Fernsehers, kann aber ohne ihn existieren. Somit erfüllt die Beziehung die Bedingung der Aggregation. Wie kann man mittels Code eine solche Beziehung realisieren? (Für die Puristen: Man nennt die Beziehung eine Komposition, wenn das Teil ohne das Ganze nicht existiert. Beispiel: Bankkunde – Kunden-Konto).
Hier ein Code-Ausschnitt aus Fernseher mit den wesentlichen Teilen in Fettdruck:

// Anfang Attribute
private int kanal;
private int anzahlFunktionen;
protected Bildschirm bildschirm;
protected Audio sound;
// Ende Attribute
// Anfang Konstruktor
public Fernseher(int anzahlFunktionen,
                Bildschirm bildschirm,
                Audio sound) {
 this.anzahlFunktionen = anzahlFunktionen;
 this.bildschirm = bildschirm;
 this.sound = sound;
 this.kanal = 1;
}
//Ende Konstruktor

Das Modell kommt der Wirklichkeit recht nahe: Der Konstruktor will einen Bildschirm und eine Audiosystem übergeben. Angenommen, es soll ein 36-Zoll Ambilight-Fernseher mit DolbyDigital-Sound hergestellt werden. Dann werden zunächst die Objekte ambilightBildschirm1 und dolbyDigital1 erzeugt. Dann erst wird der Fernseher hergestellt, der diese Objekte als „Bauteile“ bekommt.

Im UML-Tool kann man den Vorgang simulieren. Nach dem Druck auf OK steht einem ein kom­plettes Fernseh-Objekt zur Verfügung.

Vorgang simulieren im UML-Tool

Methoden, die es selbst hat, werden dort ausgeführt (z.B. naechsterKanal), Methoden, die sich auf den Bildschirm (helligkeitErhoehen) oder das Audio-System (lautstaerkeErhoehen) bezie­hen, benutzen die set- bzw. get-Methoden der jeweiligen Objekte. Das heißt insbesondere, dass das Objekt fernseher1 vom Objekt dolbyDitigal1 verlangt, mit seinen Methoden eine Aufgabe zu erledigen. Ein Code-Ausschnitt:

public void lautstaerkeErhoehen() {
   sound.setLautstaerke(sound.getLautstaerke()+1);
  }
  public void helligkeitErhoehen() {
   bildschirm.setHelligkeit(bildschirm.getHelligkeit()+1);
  }
  public void naechsterKanal() {
   kanal++;
  }

Hinweis: Das UML-Tool des Java-Editors erkennt die Art der Beziehung erwartungsgemäß nicht selbst. Von daher wird der passende Beziehungs-Pfeil per Kontextmenü hinzugefügt.

Assoziation

Die obige Beziehung („hat“) verlangt, dass das Objekt, mit dem die Beziehung besteht, Teil des Ganzen ist. Im Beispiel werden dem Konstruktor von Fernseher als Parameter zwei Objekte übergeben, ohne die der Fernseher unvollständig wäre: Ein Bildschirm-Objekt und ein Audio-Objekt. Diese Beziehung wurde Aggregation genannt.

Im Prinzip funktioniert der Fernseher schon jetzt, wenn auch etwas unkomfortabel: Es fehlt eine Fernbedienung.

Die Fernbedienung „kennt“ einen Fernseher. Damit die Unterscheidung zur Aggregation besser sichtbar wird, verzichten wir im Konstruktor der Klasse Fernbedienung auf die Übergabe des Parameters fernseher. Wir spendieren der Fernbedienung dafür eine Methode verbindungAufnehmen, ohne deren Aktivierung das Fernseh-Objekt Null (das leere Objekt) ist. Dieses Vorgehen entspricht in der Realität der Erst-Codierung der Fernbedienung.

Hier eine Gesamtübersicht und im Anschluss der Code für die Fernbedienung:

Gesamtübersicht

public class Fernbedienung {
   // Anfang Attribute
   private boolean batterieGeladen;
   private Fernseher fernseher;
   // Ende Attribute
   //Anfang Konstruktor
   public Fernbedienung() {
     this.batterieGeladen = true;
 } //Ende Konstruktor
   // Anfang Methoden
   public void tastendruckSenden(int taste) {
     switch (taste) {
       case 0: fernseher.lautstaerkeErhoehen(); break;
       case 1: fernseher.lautstaerkeVermindern(); break;
       case 2: fernseher.helligkeitErhoehen(); break;
       case 3: fernseher.helligekeitVermindern(); break;
       case 4: fernseher.kontrastErhoehen(); break;
       case 5: fernseher.kontrastVermindern(); break;
       case 6: fernseher.naechsterKanal(); break;
 } // end of switch
   }
   public boolean getBatterieGeladen() {
     return batterieGeladen;
   }

   public void verbindungAufnehmen(Fernseher fernseher) {
     this.fernseher = fernseher;
   }
   // Ende Methoden
 } // end of Fernbedienung

Vergleicht man beide Beziehungen, so wird klar, dass eine Aggregation eine spezielle Assoziation ist.

 

 

Einführung: Herunterladen [odt][330 KB]

 

Weiter zu Zugriffsmodifizierer