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).
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
}
}
Das Waggon-Modell kann leicht als Liste von Objekten verallgemeinert werden.
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).