is-Logo Objektorientierte Programmierung
Polymorphie

S. Spolwig

[Home | OOP]

Was ist Polymorphie?

 

zeigefinger.gif (1077 Byte)
  • Polymorphie ist ein besonderes Konzept der OOP. Es ist die Eigenschaft einer Variablen, für Objekte verschiedener Klassen stehen zu können, was bei typisierten Sprachen normalerweise nicht möglich ist.
     

  • Es bedeutet auch, dass dieselbe Botschaft, z.B. 'Zeigen', an unterschiedliche Objekte verschiedener Klassen innerhalb eines Vererbungsbaums gesendet werden kann und diese dann selbst wissen, wie sie es auszuführen haben.
     

  • Der Sender der Botschaft muss daher nicht wissen, zu welcher Klasse das Objekt gehört.
     

Ein Beispiel, das eine typische Situation für polymorphe Aufrufe zeigt :

Eine Liste enthält Objekte verschiedener Klassen TKreis, TRechteck, TLinie, die alle Unterklassen der Klasse TFigur sind.

TListe = class ..
   Kollektion : array[1..MAX] of TFigur;
   ...
end;

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.
Auf diese Weise kann ein Abfragen der Objektklasse in einer Mehrfachauswahl (case) vermieden werden (was im allgemeinen ein Hinweis auf unechten Polymorphismus darstellt).

procedure Traversieren;
(* ---------------------------- *)
var AktuelleFigur : TFigur;
begin
  while not Liste.EoList do
  begin
   
AktuelleFigur := Liste.GetElement; 
   
AktuelleFigur.Zeigen;              
 
end;
end;


// Der Variablen der Oberklasse TFigur
// dürfen die Variablen der Unterklassen
// zugewiesen werden.

// Es ist nicht bekannt, was kommt!
// Methodensuche


 

 

  Zuweisungsregeln

Um diesen Mechanismus zur ermöglichen, bestehen einige Regeln, die sicherstellen, daß nichts schief gehen kann. Ein Beispiel:

Poly1

Mengendiagramm

  Poly2

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 
     R : TRechteck;
     Q : TQuadrat;

begin
    R := Q;   // erlaubte Zuweisung

    Q := R;   //  verboten !!

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.
...
Da die  Nummer einer Methode zur Übersetzungszeit bekannt ist, kann der Compiler für die Nachricht ... schnellen Code erzeugen, der nur aus einem Aufruf der Methode mit der Startadresse ... besteht." 1)

Vererbung, Polymorphie und dynamische Bindung sind der Kern der objektorientierten Programmierung.

----------------
1) Rechenberg/Pomberger: Informatik-Handbuch, München 1997, S. 429


 

©    05. Oktober 2008    Siegfried Spolwig

top_page.gif (155 Byte)