Die Klasse Turtle besitzt nur ganz wenige Methoden. Wir wollen nun auch bunte Linien ziehen und außerdem einige grafische Grundobjekte (Rechteck, Kreis oder Vieleck) zeichnen.
Ist man im Besitz des Quelltextes der Klasse Turtle, dann können die Änderungen direkt dort vorgenommen werden. Dabei sollte man aber keine vorhandenen Schnittstellen ändern, da sonst darauf aufbauende, bereits existierende Programme nicht mehr lauffähig sind.
Wir wollen hier einen anderen Weg gehen, der auch dann möglich ist, wenn der Quelltext nicht vorliegt, die Schnittstellen aber bekannt sind. Dazu leiten wir eine Klasse Stift von Turtle ab, die die erwähnten Eigenschaften zusätzlich zu den bisher schon vorhandenen Eigenschaften der Turtle besitzt. Man spricht dann von Vererbung.
Die Klasse Stift erbt als Unterklasse der Klasse Turtle alle Attribute und Methoden von dieser. Zusätzlich stellt sie weitere Attribute und Methoden zur Verfügung. Auch der Konstruktor wird diese Ergänzung reflektieren.
Man spricht auch von einer IST-Beziehung: Die Klasse Stift ist eine besondere Turtle.
In Java wird diese Erweierung direkt im Definitionsteil der Klasse vorgenommen:
public class Stift extends Turtle {
...
}
Unsere Klasse Stifte soll eine Farbe zum Zeichnen bekommen. Diese soll beim Konstruktor mitangegeben werden, aber auch nachträglich änderbar sein.
public class Stift extends Turtle {
Color farbe;
// Konstruktor
public Stift(Graphics g, double x, double y, double w, Color f) {
super(g,x,y,w);
farbe = f;
}
// Ändern der Farbe
public void setFarbe(Color f) { .. }
}
Der Konstruktor kann die bereits in der Turtle gemachten Grundeinstellungen übernehmen. Dazu wird der Konstruktor der Mutterklasse mittels super(.g,x,y,w) aufgerufen. Dieser Aufruf muss immer als erste Anweisung erfolgen. Weitere zusätzliche Initialisierungen können anschließend vorgenommen werden.
Die Farbe wird durch eine Instanz der Java-Klasse Color dargestellt. Im Prinzip könnte man direkt im Konstruktor mit dem Aufruf g.setColor(farbe) die Schreibfarbe ändern. Dies setzt allerdings voraus, dass der Verweis auf die Grafikfläche bereits existiert. In vielen Fällen kann dieser aber erst zur Laufzeit zur Verfügung gestellt werden; ein Objekt wird dann mit dem Wert null für den Grafikkontexterschaffen.
Möchte man diesen Fall berücksichtigen, danndarf die Farbe erst dann gesetzt werden, wenn das Attribut Graphics g in der Mutterklasse Turtle nicht null ist.
Das UML-Diagramm einer Klasse enthält die Attribute sowie Methoden. Dabei wird folgende Legende (1. Zeichen) verwendet:
- private kann nur innerhalb der Klasse verwendet werden
+ public steht allen zur Verfügung
# protected Zugriff auch von Unterklassen erlaubt
~ abstract abstrakte Methode
Die Abhängigkeit der Klassen wird durch Pfeile gekennzeichnet. Der Pfeil von Stift zu Klasse kann etwa so interpretiert werden: "Die Klasse Stift ist eine spezielle Klasse einer Turtle, die zusätzliche Eigenschaften besitzt". Alle Attribute und Methoden von Turtle gehören automatisch auch zur Klasse Stift.

Implementiere die Klasse Stift mit den im Klassendiagramm angegebenen Methoden und teste den neuen Buntstift in einem Applet. Dabei sollen die neuen Methoden folgende Spezifikation besitzen:
void gehe()
zeichnet die Linie in der aktuellen Stiftfarbe
void setze(double x, double y, double w)
setzt die Turtle an die Position (x,y)
mit Blickrichtung w und Schreibfarbe=akt. Stiftfarbe
void setNew(Color c)
setzt die Farbe des Stiftes auf c
Color getColor()
liefert die aktuelle Stiftfarbe
void zeichneRechteck(double b, double h)
Zeichnet ein Rechteck mit der Breite b und Höhe h.
Ausgangspunkt ist die aktuelle Position des Stifts.
Das Rechteck wird im Uhrzeigersinn gezeichnet.
Der Stift befindet sich am Ende wieder in der Ausgangsposition.
void zeichneKreis(double r)
Zeichnet einen Kreis mit Radius r (in Pixel).
Die Position des Stifts ist der Mittelpunkt.
Der Stift befindet sich am Ende wieder in der Ausgangsposition.
void zeichneVieleck(int n, double len)
Zeichnet ein regelmäßiges n-Eck mit der Seitenlänge len (in Pixel)
Ausgangspunkt ist die aktuelle Turtleposition
Der Stift befindet sich am Ende wieder in der Ausgangsposition.
Quellen:
Turtle.java
StiftApplet.java