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.

Klassendiagramm

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.

X

Fehler melden

X

Suche