OOP2. Virtuelle Methoden (späte Bindung)

Für unsere Fahrzeug-Datenbank sei eine Oberklasse TFahrzeug durch entsprechende Attribute (Daten) und Methoden (Prozeduren) wie in der Zeichnung deklariert: Als Erben der Oberklasse erscheinen die beiden Klassen TFahrrad und TPkw mit ihrem eigenen Constructor Init und der Methode ShowData.

Für die Entwicklung einer Datenbank möchte man gerne alle registrierten Fahrzeuge in einer Liste führen und das Programm selber entscheiden lassen, welches Fahrzeug gerade zum Anzeigen ansteht und welche Methode dafür zu verwenden ist. Man verfolgt also eine späte Bindung der benötigten Methode an das entsprechende Objekt. Wenn Fahrzeug1 eine Instanz der Fahzeugklasse ist, so ist ein Aufruf wie z.B. Fahrzeug1.ShowData jedoch nicht erlaubt, weil diese Methode in der Fahrzeugklasse noch nicht implementiert werden kann, da sie ja für die verschiedenen abgeleiteten Klassen verschieden programmiert werden muß. Abhilfe schaffen die sogenannten "virtuellen Methoden"

Die Methode ShowData, die für verschiedene abgeleitete Klassen unterschiedlich implementiert werden muß, wird in der Oberklasse virtuell angelegt. D.h. es werden hier nur Zeiger auf später zu implementierende Methoden erzeugt, die in einer sogenannten VMT (Virtuelle Methoden Tabelle) abgelegt werden. Wird jetzt im Laufe des Programms die Methode TFahrzeug.ShowData aufgerufen, so wird zunächst festgestellt, um welchen Fahrzeugtyp es sich handelt (Instanz der Klasse TFahrrad oder TPkw). Danach wird in der VMT nachgesehen, welche der ShowData-Methoden benutzt werden muß.

Dieses Prinzip nennt man späte Bindung oder auch dynamische Bindung. Man erhält beim Aufruf von Fahrzeug.Show eine echte Polymorphie. Das reservierte Wort virtual hinter dem Kopf der virtuell deklarierten Prozedur ShowData bewirkt einen Eintrag in die VMT. Die entsprechenden Methoden in den beiden Unterklassen überschreiben die Methode der Oberklasse, dies wird durch das reservierte Wort override bewirkt.

Ein weiterer Vorteil der virtuellen Methoden ist Möglichkeit, Erweiterungen der Klassen in einfacher Form zu schreiben. Wenn die Klassendefinitionen nur in kompilierter Form (z.B. in Form einer Unit) vorliegen, so kann man eine Klasse sehr leicht erweitern, wenn nur die Schnittstelle zu der Objektdefinition bekannt ist.

Aufgaben

1. Schreibe das Programm fahrzeuge1.pas  um, indem Du virtuelle Methoden benutzt

2. Teste, wie das Programm sich während des Kompilierens und während der Laufzeit verhält, wenn man die Anweisungen virtual / override wegläßt. Begründe das Verhalten.

(Lösung : fahrzeuge2.pas)

Zurück zu Delphi

© Dietrich Praclik