is-Logo Delphi - OOP
Statische und virtuelle Methoden

S. Spolwig

[Home | OOP]

Einige Programmiersprachen wie C++ und Delphi unterscheiden zwischen statischen und virtuellen Methoden. Virtuelle Methoden können überschrieben werden, und sie können abstrakt sein. Diese Angaben spielen eine Rolle, wenn eine Variable eines bestimmten Klassentyps eine Instanz einer abgeleiteten Klasse enthält. Sie bestimmen dann, welche Implementierung beim Aufruf der Methode aktiviert wird.

Was sind statische Methoden?

zeigefinger.gif (1077 Byte)

Statische Methoden sind der Standard in Delphi-OOP und können besonderes schnell ausgeführt werden, weil sie immer exakt auf dasselbe Codestück zugreifen und dieselbe Operation ausführen.

Beispiel:

TLinie = class
             ...
             procedure Zeigen;
           end;

Sie können nicht überschrieben werden. Eine statische Methode mit demselben Namen in einer Unterklasse überdeckt (ersetzt) einfach die geerbte.

Damit ist auch ihre Schwäche beschrieben. Der Käufer eines compilierten Listenmoduls, das mit statischen Methoden erstellt wurde, kann damit immer nur die gleichen Typen bearbeiten und es nicht für etwas anderes erweitern. Aus diesem Dilemma helfen virtuelle Methoden, bei denen erst zur Laufzeit entschieden wird, mit welchem Typ sie ablaufen. Daraus ergibt sich die Möglichkeit, ein compiliertes Bibliotheksmodul auch nachträglich zu erweitern, ohne dass einem der Quellcode zur Verfügung steht.

Was sind virtuelle Methoden?

zeigefinger.gif (1077 Byte)


Virtuelle Methoden können im Gegensatz zu statischen Methoden in abgeleiteten Klassen überschrieben werden. Beim Aufrufen einer überschriebenen Methode bestimmt nicht der deklarierte, sondern der aktuelle Typ (also der Typ zur Laufzeit) der im Aufruf verwendeten Klassen- bzw. Objektvariable, welche Implementierung aktiviert wird.
 

1. Überschreiben

Beim Darstellen von verschiedenen Figuren auf dem Bildschirm ist klar, daß alle die Methode Zeigen haben, aber jede Figur anders gezeichnet wird. Mit Hilfe der Direktive virtual können Methoden als virtuell deklariert werden.

TFigur = class
           ....
           procedure Zeigen; virtual;
         end;

TLinie = class (TFigur)
           ....
           procedure Zeigen; override;
         end;

Um eine Methode zu überschreiben, braucht sie nur mit der Direktiven override erneut deklariert zu werden. Dabei müssen Reihenfolge und Typ der Parameter sowie der Typ des Rückgabewertes (falls vorhanden) mit der Deklaration in der Oberklasse übereinstimmen.


2. Überdecken

Wenn man aus einem bestimmten Grund eine virtuelle Methode überdecken will, gibt der Compiler Warnungen aus, die mit Hilfe der Anweisung reintroduce verhindert werden können, wenn sie stören.

Ein Beispiel:

function IstGleich : boolean; virtual;        // in der Oberklasse

function IstGleich : boolean; reintroduce;    // in der Unterklasse

 

Unterschied zwischen Überschreiben und Überdecken

Wenn in einer Methodendeklaration dieselben Bezeichner- und Parameterangaben wie bei einer geerbten Methode ohne die Anweisung override angegeben werden, wird die geerbte Methode durch die neue Deklaration verdeckt. Beide Methoden sind jedoch in der abgeleiteten Klasse vorhanden, in der die Methode statisch gebunden wird.

 

3. Überladen

Man kann mehrere Routinen mit identischen Namen in demselben Gültigkeitsbereich deklarieren. Dieses Verfahren wird Überladen genannt. Überladene Routinen müssen mit der Direktive overload deklariert werden und unterschiedliche Parameterlisten haben:

function Divide(X, Y: Real): Real; overload;
begin
   Result := X/Y;
end;

function Divide(X, Y: Integer): Integer; overload;
begin
   Result := X div Y;
end;

 

Hilfe - welche Methode soll ich nehmen?

Statische Methoden:

Wenn ich sicher bin, dass die Methode nie mehr erweitert werden soll.

Virtuelle Methoden:

  • Bei Klassen / Methoden, die wahrscheinlich irgendwann im Vererbungsbaum erweitert werden sollen.
  • Bei Klassen, die kompiliert (.dcu) weitergegeben werden (Bibliotheksmodule).
  • Bei polymorphen Anwendungen.

Man kann aber nichts falsch machen, wenn man wenn alle Methoden virtuell deklariert.


(Dieser Text ist eng an das Delphi 4 Hilfesystem angelehnt)


©    05. Oktober 2008    Siegfried Spolwig

page_top