next up previous
Nächste Seite: Generische Module Aufwärts: OO-Techniken in Oberon Vorherige Seite: Typerweiterungen

Typentests

Wenn ein Zeiger oder Variablenparameter gegeben ist, dann sind zwei Typen damit assoziiert: der statisch bekannte Typ und der zur Laufzeit bestimmte Typ. Dabei gilt natürlich, daß der Typ zur Laufzeit eine Erweiterung des statischen Typs sein muß.

Oberon bietet einen Operator an, der es erlaubt, den dynamischen Typ zu überprüfen:

PROCEDURE Draw(VAR figure: Figure);
BEGIN
   IF figure IS Circle THEN
      (* Kreis zeichnen *)
   ELSIF figure IS Rectangle THEN
      (* Rechteck zeichnen *)
   ELSE
      (* unbekannt *)
   END;
END Draw;

Eine Typzusicherung ermöglicht es dann, eine Variable entsprechend der angegebenen Erweiterung zu behandeln:

(* Kreis zeichnen *)
DrawCircle(figure(Circle));

(* Zugriff auf den Radius *)
diameter := figure(Circle).r * 2;

Mit Hilfe der WITH-Anweisung kann sich eine Typzusicherung über eine Reihe von Anweisungen erstrecken:

WITH figure: Rectangle DO
   area := figure.w * figure.h;
END;

Die Typentests von Oberon erscheinen auf den ersten Blick im Umfeld objekt-orientierter Sprachen nicht notwendig. Gerade obiges Beispiel scheint es zu belegen, da die Methode Draw individuell für jede der möglichen Varianten sein sollte. Ein Test für alle möglichen Fälle sollte unbedingt vermieden werden.

So haben wohl auch die Designer von Eiffel und C++ ursprünglich gedacht, die zunächst keine entsprechenden Sprachmittel eingeführt haben. In Eiffel wurde dies später nachgeholt durch das reverse assignment attempt, das es erlaubt, eine Zuweisung entgegen der üblichen Kompatibilitätsregeln zu versuchen:

-- Eiffel's reverse assignment attempt
local
   t: T;
   u: U; -- U ist eine Erweiterung von T
-- ...
   u ?= t;
   if not u = Void then -- Test auf Erfolg
      -- Zugriff auf Komponenten der Erweiterung ueber u moeglich
   end;

In C++ ist ein entsprechender nur Mechanismus geplant. Dies führte dazu, daß er bei einigen Klassenbibliotheken (z.B. ET++) simuliert wird oder - noch schlimmer - durch einen ungesicherten cast ersetzt wird.

Das wichtigste Anwendungsfeld für Typentests und Typzusicherungen sind heterogene Datenstrukturen, bei denen nur ein gemeinsamer Basistyp festgelegt wird. Ein Beispiel dafür wäre eine Liste von Figure-Objekten, in der auch Kreise und Rechtecke vorkommen können. In Oberon finden Typentests und Zusicherungen auch noch Anwendung bei einer Reihe von objekt-orientierten Techniken, die im einzelnen noch vorgestellt werden.


next up previous
Nächste Seite: Generische Module Aufwärts: OO-Techniken in Oberon Vorherige Seite: Typerweiterungen
Andreas Borchert 2000-12-18