Impressum | Kontakt
 Startseite | Kurse Projekte | Haskell | Fortbildungen | Linux | Suche

Modellerweiterung

In diesem Abschnitt wird der Lokomotive des Zuges eine besondere Bedeutung zugewiesen. Sie ist der Waggon, der das Steuern der Bahn übernimmt. Alle Waggons erhalten eine Methode anhaengen, die an den aktuellen Waggon einen weiteren Waggon anhaengen. Wenn dort bereits ein anderer Waggon angekoppelt ist, dann wird der Auftrag an diesen weitergeleitet.

Dazu muss die Klasse Waggon ein Attribut naechster erhalten, der einen Verweis auf den nachfolgenden Waggon enthält bzw. null ist, wenn kein Waggon folgt.

  // Ergänzungen der Klasse Waggon

  Waggon naechster;  // Verweis auf den nachfolgenden Waggon

  public void anhaengen(Waggon w)  
  // Wenn der aktuelle Waggon keinen Nachfolger besitzt, ist w angefügt
  // sonst wird der Auftrag an den aktuellen Nachfolger weitergereicht

Damit kann ein Zug einfach aufgebaut werden:

  // Aufbau eines Zuges bestehend aus einer Lokomotive und zwei Waggons
  Waggon zug = new Lokomotive(100,50,COLOR.black);  // Verweis auf die Lokomotive
  zug.anhaengen(new Gueterwaggon(0,0,COLOR.green)); // Die Position wird in
  zug.anhaengen(new Personenwaggon(0,0,COLOR.red)); 
// anhaengen() überschrieben

Wichtig ist nun, dass das Objekt zug nicht mehr verloren geht, denn damit hält man den ganzen Zug in der Hand (Referenz, Handle). 

Realistische Fortbewegung

Unser bisheriger Zug wurde im Steuerprogramm Waggon für Waggon fortbewegt. Dies entspricht nicht gerade den physikalischen Gegebenheiten. Vielmehr zieht die Lokomotive die übrigen Waggons bzw. schiebt diese vor sich her.

Deshalb soll nun eine Methode bewegeUm hinzukommen, die jeden Waggon um eine bestimmte Pixelzahl bewegt und anschließend den anhängenden Waggon mit demselben Auftrag betreut. Realistisch wird dies aber nur dann, wenn die Bewegung Pixelweise vor sich geht. 

Im Steuerprogramm kann dann der Zug sehr einfach fortbewegt werden:

  // Fortbewegung des Zuges um 100 Pixel nach links

  for (int i=0; i<100; i++) {
    zug.bewegeUm(1);   // Verweis auf den nachfolgenden Waggon
    // irgendwie warten bzw. verzögern

  }

Damit kann ein Zug einfach aufgebaut werden:

  // Die Methode bewegeUm bewegt den Waggon um x Pixel nach links (x>0) bzw rechts (x<0)
  // und beauftragt dann den nachfolgenden Waggon, dasselbe zu tun.

  public void bewegeUm(int x) {  
     // erst löschen
     // dann verschieben
     // und neu zeichnen
     if (naechster != null)
         naechster.bewegeUm(x); // rekursiver Aufruf für den Nachfolger
     }
  }

 

Abstraktion

Das Waggon-Modell kann leicht als Liste von Objekten verallgemeinert werden. 

  • Die Lokomotive spielt die "führende Rolle", stellt also den Kopf der Liste dar.
  • Die anhängenden Waggons beschreiben den Schwanz der Liste.
  • Um zum letzten Waggon zu kommen, muss die ganze Liste durchlaufen werden
  • Der Listenkopf (Lokomotive) darf niemals aus der Hand gegeben werden, da sonst die ganze Liste verloren ist.
  • Über die Puffer ist der Waggon mit dem nachfolgenden verkoppelt. Hierzu wird ein Attribut naechster benötigt, das denselben Typ wie die Elemente besitzt, also selbst eine Liste beschreibt.

Dieses Listenmodell heißt ,,linear verkettete Liste'' und wird im folgenden Abschnitt ausführlich untersucht. Häufig wird es durch folgende grafische Darstellung veranschaulicht: das gelbeQuadrat beschreibt den Kopf, die grünen Quadrate stellen Elemente der Liste dar, das rote Quadrat ist das letzte Listenelement (naechster =null).