Die Bindung der Methoden bei der Vererbung

Zurück zur Hauptseite

                                                 

Zurück zur Übersichtsseite

Wer damals unter Borland/Tubo-Pascal auf die OOP stieß, kann sich vielleicht noch an den Moment erinnern, als er lernte, wann Objektmethoden als "virtual" zu kennzeichnen sind.
Die Überraschung bestand ja darin, dass statisch gebundene Methoden (frühe Bindung) sich danach nicht mehr polymorph verhielten. Das zeigt sich darin, dass Methoden in einer Klassenhierarchie, die in den einzelnen Klassen den gleichen Namen haben und jeweils abhängig davon, von welcher Klasse sie aufgerufen werden, sich dann passend dazu verhalten, während der Laufzeit nicht mehr überschrieben werden. Eigentlich ist das ein Problem, das Compiler haben. Hier haben wir einen Interpreter. Aber da der Bytecode ja vorcompiliert wird, wollen wir es wissen. Man muss ja nicht erst warten, bis unerklärliche Fehler auftreten.

Hier ein Beispiel, bereits in Python geschrieben, das unter Turbo-Pascal eine falsche Meldung gebracht hätte:

# spaete bindung (virtuelle methoden)

class auto:
def __init__(self, name):
self.n = name

def move(self):
self.meldung()

def meldung(self):
print 'Auto faehrt'


class lkw(auto):
def __init__(self, name, last):
auto.__init__(self, name)
self.l = last

def meldung(self):
print 'LKW faehrt mit', self.l, 't'


a1 = auto('Opel')
a1.move()

k1 = lkw('Renault', 20)
k1.move()

Es wird erwartet, dass jede Klasse ihre passende Meldung bringt. Das wird aber hier absichtlich dadurch erschwert, dass die Meldung durch die Methode move aufgerufen wird. Diese gibt es aber nicht gesondert in der Klasse lkw. Daher wird die move-Methode aus der Klasse auto die Methode meldung aufrufen (Vererbung). Bei einer statischen Bindung würde jetzt fehlerhaft deshalb die statisch gebundene Meldung von Auto kommen, weil die Methode move der Klasse auto natürlich auch die zugehörige Methode meldung aufruft, was nicht gewollt ist.

Python bemerkt dieses Problem jedoch selbständig und bring die passende richtige Meldung. Damit ist gezeigt, dass die Methoden mit einer späten Bindung arbeiten. Das ist die gleiche Arbeitsweise, wie es unter TurboPascal mit dem zusätzlichen Schlüsselwort "virtual" erzwungen werden konnte.