Exkurs - Implementierung in Python
Deklaration einer Klasse
Am Beispiel der Klassen Rucksackroboter
und Roboter
sollen die Besonderheiten
aufgezeigt werden, die man bei der
Implementierung von Vererbung in Python beachten muss.
Ausgangspunkt ist das folgende Klassendiagramm, das die Vererbungsbeziehung der beiden Klassen beschreibt.
Eine Implementierung in Python könnte wie folgt aussehen:
# -*- coding: iso-8859-1 -*- # Deklaration der Klasse Roboter class Roboter(object): def __init__(self): ... ... # Deklaration der Klasse Rucksackroboter class Rucksackroboter(Roboter): def __init__(self, anzahl): Roboter.__init__(self) self.rucksack = anzahl def getRucksack(self): return self.rucksack def setRucksack(self, anzahl): self.rucksack = anzahl def getZustand(self): return (self.x, self.y, self.r, self.rucksack) def setZustand(self, x, y, r, anzahl): self.x = x self.y = y self.r = r self.rucksack = anzahl def ziegelHinlegen(self): if self.nichtVorWand() and self.rucksack > 0: Roboter.ziegelHinlegen(self) self.rucksack = self.rucksack - 1 def ziegelAufheben(self): if self.nichtVorWand() and self.vorZiegel(): Roboter.ziegelAufheben(self) self.rucksack = self.rucksack + 1
Die Vererbungsbeziehung wird durch die Deklaration class Rucksackroboter(Roboter)
festgelegt.
Hier wird die Basisklasse in Klammern angegeben. Wenn keine Vererbungsbeziehung festgelegt werden soll, dann
wird - im Beispiel class Roboter(object)
- als Basisklasse object
angegeben.
Übernommene Attribute und Methoden werden in der Deklaration der Subklasse nicht aufgeführt. Ergänzende Attribute und Methoden werden wie üblich deklariert. Beim Überschreiben von Methoden kann man oft verschiedene Wege gehen.
Eine Möglichkeit besteht darin, die Definition der Methode neu zu erstellen:
# Deklaration der Klasse Roboter
class Roboter(object):
...
def ziegelHinlegen(self):
if self.r == 'O' and self.x < self.w.getFelderX()-1:
self.w.incZiegel(self.x+1, self.y)
elif self.r == 'S' and self.y < self.w.getFelderY()-1:
self.w.incZiegel(self.x, self.y+1)
elif self.r == 'W' and self.x > 0:
self.w.incZiegel(self.x-1, self.y)
elif self.r == 'N' and self.y > 0:
self.w.incZiegel(self.x, self.y-1)
...
# Deklaration der Klasse Rucksackroboter
class Rucksackroboter(Roboter):
...
def ziegelHinlegen(self):
if self.nichtVorWand() and self.rucksack > 0:
if self.r == 'O':
self.w.incZiegel(self.x+1, self.y)
elif self.r == 'S':
self.w.incZiegel(self.x, self.y+1)
elif self.r == 'W':
self.w.incZiegel(self.x-1, self.y)
elif self.r == 'N':
self.w.incZiegel(self.x, self.y-1)
self.rucksack = self.rucksack - 1
...
Oft kann man beim Überschreiben aber auch die entsprechende Methode der Basisklasse nutzen:
# Deklaration der Klasse Roboter
class Roboter(object):
...
def ziegelHinlegen(self):
if self.r == 'O' and self.x < self.w.getFelderX()-1:
self.w.incZiegel(self.x+1, self.y)
elif self.r == 'S' and self.y < self.w.getFelderY()-1:
self.w.incZiegel(self.x, self.y+1)
elif self.r == 'W' and self.x > 0:
self.w.incZiegel(self.x-1, self.y)
elif self.r == 'N' and self.y > 0:
self.w.incZiegel(self.x, self.y-1)
...
# Deklaration der Klasse Rucksackroboter
class Rucksackroboter(Roboter):
...
def ziegelHinlegen(self):
if self.nichtVorWand() and self.rucksack > 0:
Roboter.ziegelHinlegen(self)
self.rucksack = self.rucksack - 1
...
Hier wird mit der Anweisung Roboter.ziegelHinlegen(self)
die Methode ziegelHinlegen
der Basisklasse Roboter
aktiviert.