Eine allgemeine Ampel-Klasse
Zustände zyklisch durchlaufen
Auto- und Fußgängerampeln weisen eine Reihe von Gemeinsamkeiten auf. Beim Weiterschhalten durchlaufen beide zyklisch eine bestimmte Folge von Zuständen.
Autoampel:
Fußgängerampel:
Eine Klasse für beliebige Ampeln
Das Verhalten von Ampeln lässt sich verallgemeinernd mit dem folgenden Klassendiagramm beschreiben:
Hier eine Implementierung zu dieser allgemeinen Ampel
-Klasse.
class Ampel(object):
def __init__(self, pListeZustaende):
self.listeZustaende = pListeZustaende
self.indexAktuellerZustand = 0
def schalten(self):
if self.indexAktuellerZustand < len(self.listeZustaende)-1:
self.indexAktuellerZustand = self.indexAktuellerZustand + 1
else:
self.indexAktuellerZustand = 0
def getZustand(self):
return self.listeZustaende[self.indexAktuellerZustand]
def setZustand(self, z):
self.indexAktuellerZustand = self.listeZustaende.index(z)
# Test
a = Ampel(['rot', 'rotgelb', 'gruen', 'gelb'])
a.setZustand('rot')
print(a.getZustand())
print()
for i in range(4):
a.schalten()
print(a.getZustand())
print()
Aufgabe 1
(a) Simuliere mit dieser Klasse das Verhalten einer Fußgängerampel.
(b) Autoampeln in anderen Ländern (z.B. in Frankreich) verhalten sich manchmal
etwas anders als in Deutschland. Benutze die Klasse Ampel
zur Simulation einer solchen Ampel.
Spezielle Ampelklassen
Aus der allgemeinen Ampel
-Klasse kann man durch eine Erweiterung Klassen für
Auto- und Fußgängerampeln gewinnen.
Die Klassen AmpelAuto
und AmpelFussgaenger
sollen dabei sämtliche Attribute und
Methoden der Basisklasse Ampel
übernehmen (man sagt auch erben) und zusätzlich die im
Klassendiagramm aufgeführten neuen
Methoden (die Konstruktormethode und die Methode getLampen
) vorsehen.
Hier eine Implementierung der beiden Klassen Ampel
und AmpelAuto
.
Beachte den Erweiterungshinweis
AmpelAuto(Ampel)
bei der Deklaration der Klasse AmpelAuto
.
class Ampel(object):
def __init__(self, pListeZustaende):
self.listeZustaende = pListeZustaende
self.indexAktuellerZustand = 0
def schalten(self):
if self.indexAktuellerZustand < len(self.listeZustaende)-1:
self.indexAktuellerZustand = self.indexAktuellerZustand + 1
else:
self.indexAktuellerZustand = 0
def getZustand(self):
return self.listeZustaende[self.indexAktuellerZustand]
def setZustand(self, z):
self.indexAktuellerZustand = self.listeZustaende.index(z)
class AmpelAuto(Ampel):
def __init__(self, anfangszustand):
self.listeZustaende = ['rot', 'rotgelb', 'gruen', 'gelb']
self.indexAktuellerZustand = self.listeZustaende.index(anfangszustand)
def getLampen(self):
zustand = self.listeZustaende[self.indexAktuellerZustand]
if zustand == 'rot':
lampen = (True, False, False)
elif zustand == 'rotgelb':
lampen = (True, True, False)
elif zustand == 'gruen':
lampen = (False, False, True)
elif zustand == 'gelb':
lampen = (False, True, False)
return lampen
# Test
a = AmpelAuto('gruen')
print(a.getZustand())
print(a.getLampen())
print()
for i in range(4):
a.schalten()
print(a.getZustand())
print(a.getLampen())
print()
Aufgabe 2
(a) Führe das Programm selbst aus. Kannst du das Verhalten erklären?
(b) Entwickle analog eine Klasse AmpelFussgaenger
und teste sie.