Was ist Polymorphie?
|
Ein Beispiel, das eine typische Situation für polymorphe Aufrufe zeigt : TListe = class
.. Die Liste soll traversiert und alle
vorgefundenen Grafikobjekte gezeigt werden. Das erledigt die Methode virtuelle Methode Figur.Zeigen,
der die unbekannten Objekte aus der Liste übergeben werden. Zur
Laufzeit wird dann die passende Methode Kreis.Zeigen oder Rechteck.Zeigen
usw. eingesetzt.
|
Zuweisungsregeln Um diesen Mechanismus zur ermöglichen, bestehen einige Regeln, die sicherstellen, daß nichts schief gehen kann. Ein Beispiel:
Ein Quadrat ist eine Spezialisierung eines Rechtecks, wobei Länge und Breite gleich sind. Man kann sagen, ein Quadrat ist eine Art Rechteck (is_a), aber nicht jedes Rechteck ist ein Quadrat. Es liegt also eine asymmetrische Beziehung vor, die entsprechend abgebildet werden kann: var begin Die Methode Drag kommt in der Schnittstelle von TRechteck nicht vor und würde deshalb nicht erreicht werden. Dynamische Bindung Bei nicht-objektorientierten Sprachen
kann die Bindung zwischen einem Prozeduraufruf und dem dazugehörigen Code
statisch, d. h. fest schon zur Übersetzungszeit erfolgen. Wegen der
Polymorphie geht das bei OO-Sprachen nicht, weil bei der Übersetzung dem Compiler nicht bekannt
ist, welches
Objekt übergeben wird; erst zur Laufzeit wird dieses entschieden.
Dieser Mechanismus wird als dynamisches Binden oder 'late binding'
bezeichnet. a) Dynamische Bindung durch Methodensuche Im oberen Beispiel haben alle Klassen die Methode 'Zeigen'. TFigur als abstrakte virtuelle Methode, weil hier noch nicht festgelegt werden kann, welche Figur in den Unterklassen wie gezeichnet wird; TRechteck hat die konkrete Methoden 'Zeigen' und Quadrat erbt 'Zeigen' von Rechteck, weil es genauso gezeichnet wird (Vererbungssituation). Das mit Quadrat.Zeigen angesprochene Objekt wird zunächst nachsehen, ob es eine eigene Methode 'Zeigen' hat und diese dann ausführen. Wenn nicht, wird in der Oberklasse die passende Methode gesucht und eventuell darüber usw. b) Dynamische Bindung durch Virtuelle-Methoden-Tabellen (VMT)
"Methodensuche ist langsam. In
typisierten Sprachen kann sie vermieden werden, in dem man die Methoden
einer Klasse numeriert und ihre Startadresse in einer Methodentabelle
(je einer pro Klasse) ablegt. Wenn von einer Klasse eine neue abgeleitet
wird, dann wird für die Subklasse zuerst eine Kopie der Methodentabelle
ihrer Superklasse erzeugt. Diese Kopie wird um zusätzliche Methoden
erweitert. Beim Überschreiben werden die Startadressen der geerbten
Methoden durch jene der überschreibenden Methoden ersetzt. Vererbung, Polymorphie und dynamische Bindung sind der Kern der objektorientierten Programmierung. ---------------- |
© 05. Oktober 2008 Siegfried Spolwig |
|