4.3 Übungen: Ampel und Windpark
Ampel
Die nebenstehende Ampelkreuzung kann mit weniger Aufwand programmieren, wenn man für die Ampel eine eigene Klasse erstellt. Dabei wird das Programmierparadigma Programmiere eine Klasse, erstelle viele Objekte! umgesetzt.
Gleiche Klasse heißt nicht gleich!
Wenn man nun Objekte dieser Klasse erzeugt, beinhalten alle Objekte die gleichen Attribute, allerdings können die Attributswerte unterschiedlich sein! Im Bild oben besitzen alle Ampel-Objekte einen SGKreis, um das rote Licht darzustellen, aber bei zwei Ampeln ist die Farbe rot, bei den anderen beiden Ampeln schwarz: Die Attributswerte sind unterschiedlich.

Aufgaben
Wir benötigen für das Projekt Ampelkreuzung zwei Klassen: Ampelkreuzung
und Ampel
.
1. Attribute der Klassen Ampelkreuzung
und Ampel
Entscheide, in welche der Klassen die folgenden Objekte gehören:
meineLeinwand: SGLeinwand
gruenesLicht: SGKreis
ampelRechts: Ampel
strasseQuer: SGRechteck
ampelkasten: SGRechteck
ampelLinks: Ampel
ampelmast: SGRechteck
gelbesLicht: SGKreis
ampelOben: Ampel
ampelUnten: Ampel
ampelfuss: SGRechteck
strasseLaengs: SGRechteck
rotesLicht: SGKreis

2. Methoden der Klassen Ampelkreuzung
und Ampel
Entscheide, in welche der Klassen die folgenden Methoden gehören:Ampel(pX: double, pY: double)
schalteAmpelRot()
schalteAmpelGelb()
schalteAmpelGruen()
schalteLaengsGruen()
schalteQuerGruen()

3. Der Konstruktor
Erkläre die Bedeutung der Parameter des Konstruktors Ampel(pX: double, pY: double)
.
4. Implementation der Ampelkreuzung
Öffne das Projekt Ampelkreuzung. Hier sind bereits die beiden Klassen Ampelkreuzung
und Ampel
angelegt, allerdings sind noch nicht alle Attribute und Methoden implementiert. Übertrage zuerst die Ergebnisse aus deinem UML-Implementationsdiagramm in die beiden Klassen. Programmiere dann zu aller erst die Methoden der Ampel, angefangen mit dem Konstruktor. Anschließend kannst du die verbliebenen Methoden programmieren.
Hinweis
Konstruktor: Der Konstruktor ist eine spezielle Methode, die bei der Erzeugung eines Objekts ausgeführt wird. Jeder Klasse hat mindestens einen Konstruktor. Er wird mit dem Schlüsselwort new
aufgerufen:
mausi = new SGMaus();
Windpark
In einem Windpark stehen mehrere Windräder. Diese haben drei Rotorblätter und einen Mast. Die Rotorblätter können sich drehen. Dabei dreht sich jedes Windrad in seiner eigenen Geschwindigkeit.

Aufgaben
1. UML-Diagramm
Erstelle ein UML-Implementationsdiagramm für den Windpark. Die Modellierung soll zwei Klassen umfassen: Die Klasse Windrad
und die Klasse Windpark
, wobei der Windpark die einzelnen Windräder verwaltet. Die folgenden Aufgaben können dir bei der Erstellung der Diagramme helfen:
- Beschreibe, worin sich die einzelnen Windräder unterscheiden und überprüfe, ob der Konstruktor der Klasse Windrad dies berücksichtigt.
- Überprüfe, ob die Klasse Windpark eine Methode zur Verfügung stellt, um das Drehen der Windräder zu ermöglichen.
- Überprüfe dein UML-Diagramm, ob auch die unterschiedlichen Geschwindigkeiten, mit denen sich die Windräder drehen, berücksichtigt sind.
Hinweis: Wenn du noch einmal eine Erklärung zu UML-Diagrammen brauchst, schau hier nach.
2. Konstruktor-Probleme
Bei der Programmierung der Anwendung hat ein Schüler für die Klasse Windrad
den folgenden Konstruktor gewählt:
public Windrad(double pX, double pY, double pGeschwindigkeit)
In der Klasse Windpark
werden vier Windräder (w1
bis w4
) erstellt. Beim Übersetzen des Quelltextes wird aber ein Fehler ausgeworfen. Erkläre den Fehler und korrigiere ihn.

3. „Da dreht sich nichts!“
Im gleichen Programm soll in der Methode fuehreAus
das Drehen der Windräder implementiert werden. Erkläre den Fehler, der hier gemacht wurde.

4. „Jetzt aber mal Tempo!“
Kommentiere den folgenden Quelltext. Gehe dabei besonders auf die Bedingung der if
-Verzweigung und auf ihren Inhalt ein.
public void fuehreAus()
{
while(tasti.esc() == false)
{
if( tasti.tasteGedrueckt('+') == true)
{
double temp = w1.gibGeschwindigkeit();
temp = temp + 1;
w1.setzeGeschwindigkeit(temp);
}
w1.drehe();
w2.drehe();
w3.drehe();
w4.drehe();
SGSystem.warte();
}
}
Zusatzaufgabe: Gib- und Setze-Methoden (Vorsicht: schwierig!)
Stelle Vermutungen auf, wie die Methoden gibGeschwindigkeit
und setzeGeschwindigkeit
der Klasse Windrad
modelliert und implementiert werden müssen.