Typbestimmung und -umwandlung mit is und as

Object Pascal im Detail - Objektorientierung www.delphi-treff.de 106 constructor TSchachbrett.Create; begin FFelder[ 1 , 1 ] := TTurm.Create ‘a‘ , 1 ; FFelder[ 1 , 2 ] := TBauer.Create ‘a‘ , 2 ; ... end; Unser Schachbrett ist nun mit Figuren gefüllt, das Spiel kann also beginnen. Angenommen, von außen ein Teil unseres Programms, den wir für dieses Beispiel einfach ignorieren käme der Befehl, die Figur von Position A1 nach A5 zu verschieben. Unser TSchachbrett kann in seinem Array nachschauen und findet auf Position A1 tatsächlich eine Figur. Da das Array aber vom Typ TFigur ist, weiß es erst einmal nicht, ob es sich um einen Turm oder einen Bauern handelt. Das ist aber auch egal. Wichtig ist, dass alle Figu e die Methode „Ziehe ke e . Diese ha e i ä li h i „TFigu i ple e tie t u d da it au h an die Unterklassen vererbt. Folgender Aufruf ist also möglich: if FFelder[ 1 , 1 ] nil then FFelder[ 1 , 1 ].Ziehe‘a‘, 5 ; Sicherheitshalber prüfen wir, ob auf dieser Position tats ä hli h ei e Figu steht ode i ht. „ il ist ei eige ins Leere. Alle Felde des “ ha h etts, a de e kei e Figu steht, u de it „ il i itialisie t. Die Methode „Ziehe sel st uft „IstZugE lau t auf, as z a i TFigu i ht dekla ie t ist, a er von jeder Unterklasse zur Verfügung gestellt wird, was die abstrakte Methode in TFigur verlangt. Dieses Ko zept e t a Pol o phie, zu Deuts h „Vielgestaltigkeit . Ei e Va ia le hie u se A a i d mit einem bestimmten Typ deklariert TFigur, ent hält zu Laufzeit a e ei e a de e T p TTu , TBaue … . Das funktioniert übrigens nur mit Unterklassen des deklarierten Typs.

4.8.8.1. Typbestimmung und -umwandlung mit is und as

Der Aufruf von Methoden, die alle Nachfahren von TFigur kennen, ist also kein Problem. Aber was wäre, wenn der Turm eine zusätzliche Methode anbieten würde, die nur er kennt? In der Realität wäre das z.B. Rochade. Dabei handelt es sich um einen besonderen Schachzug, bei dem König und Turm getauscht werden. Für alle, die es genau wissen wollen: http:de.wikipedia.orgwikiRochade Dann würde folgender Aufruf zum Fehler führen: FFelder[ 1 , 1 ].Rochade; Funktioniert nicht Denn alle Elemente des Arrays sind ja vom Typ TFigur, und TFigur kennt die Methode „Rochade i ht. Wir müssen also prüfen, ob es sich bei der Figur um einen Turm handelt. Das funktioniert in Delphi mit dem “ hlüssel o t „is : Object Pascal im Detail - Funktions- und Methodenzeiger www.delphi-treff.de 107 if FFelder[ 1 , 1 ] is TTurm then ... Wenn wir uns nun sicher sind, einen Turm in der Hand zu haben, müssen wir dem Compiler noch mitteilen, dass e das O jekt i ei e Tu u a del soll, da it die Methode „Rochade aufge ufe e de ka . Das a ht a it de “ hlüssel o t „as : FFelder[ 1 , 1 ] as TTurm.Rochade; Ü li he eise e de „is u d „as i ht ge ei sa e e det, so de it „is gep üft u d da ha t gecastet: if FFelder[ 1 , 1 ] is TTurm then FFelder[ 1 , 1 ] as TTurm.Rochade; Ode u it „as gea eitet, e a si h e eits si he ist, ei e esti te Klasse zu ha e .

4.9. Funktions- und Methodenzeiger

Funktionen und Prozeduren können selbst in Variablen gespeichert werden bzw. ein Verweis auf sie. Somit ist es möglich, einer Funktion eine andere Funktion als Parameter zu übergeben. type TMeineFunktion = function: Integer; In diesem Fall haben die Funktionen oder Prozeduren keinen Namen, sondern bestehen aus dem Schlüsselwort function oder procedure, bei Bedarf gefolgt von Parametern in runden Klammern und einem Rückgabewert. Ha delt es si h u Methode , folgt o h „of o je t : TMeineMethode = procedure of object; Praktischer Nutzen der Sache: Man kann somit eine Ereignisbehandlungsroutine erstellen und erst zur Laufzeit einem Objekt einer Komponente zuordnen. Beispiel: