Home » Object Pascal » Polymorphie

Polymorphie

Typecasting – is und as

Durch voriges Beispiel ergibt sich allerdings ein Problem. Die Variable m ist vom Typ TMensch, verweist aber auf einen Schüler. Nach der Definition der Klasse TSchueler besitzt diese das Attribut FTaschengeld. Die Anweisung m.FTaschengeld führt jedoch zu einer Fehlermeldung, da der Compiler die Variable m nach wie vor für eine Instanz von TMensch hält. Nun wissen wir jedoch, dass m inzwischen auf einen Schüler verweist und deshalb auch das Taschengeld kennen muss. Der Delphi-Compiler ist so flexibel, dass wir ihm das mitteilen können. Dazu gibt es den Operator as.

(m as TSchueler).FTaschengeld

Hiermit sagen wir dem Compiler: Nimm das Objekt m und gehe davon aus, dass es gerade auf eine TSchueler-Instanz verweist. Der Compiler prüft, ob das Objekt (im Beispiel m) und die Klasse (im Beispiel TSchueler) in Beziehung zueinander stehen, also wenn die Typen voneinander abgeleitet sind, falls sie unterschiedlich sind). In unserem Fall stellt der Compiler fest, dass TSchueler ja das Attribut FTaschengeld hat. Die Anweisung wird also akzeptiert. Löschen wir allerdings die Zuweisung m:=s, so dass m doch nur auf eine TMensch-Instanz und nicht auf einen Schüler verweist, gibt es zur Laufzeit logischerweise eine Bestrafung. Unter der Tatsache, dass der Compiler nicht vorhersagen kann, von welcher Klasse ein Objekt nun wirklich ist, das sich hinter einer Objektreferenz verbirgt, versteht man den Begriff Polymorphie (Vielgestaltigkeit).
Neben as gibt es auch noch den Operator is. Mit ihm können wir feststellen, welchen Typ eine Instanz hat, auf die eine Variable verweist.

if (m is TSchueler) then ...

So könnten wir an einer späteren Stelle im Programm prüfen, ob m immer noch auf die Schüler-Instanz verweist.