Unterstützende Klassen und Records (Object Pascal)

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Klassen und Objekte - Index


Dieses Thema befasst sich mit der Syntax für die Deklaration von unterstützenden Klassen.

Allgemeines zu unterstützenden Klassen und Records

Eine unterstützende Klasse bzw. Record ist ein Typ, der beim Verknüpfen mit einer anderen Klasse oder einem anderen Record zusätzliche Methodennamen und Eigenschaften einführt. Diese können im Kontext des verknüpften Typs (und dessen Nachkommen) verwendet werden. Unterstützende Klassen ermöglichen es, eine Klasse ohne Vererbung zu erweitern. Das ist auch für Records nützlich, die überhaupt keine Vererbung zulassen. Unterstützende Klassen vergrößern den Gültigkeitsbereich, den der Compiler bei der Zuordnung von Bezeichnern verwendet. Bei der Deklaration einer unterstützenden Klasse bzw. Records geben Sie den jeweiligen Namen sowie den Namen des Typs an, der erweitert werden soll. Eine unterstützende Klasse bzw. ein Record kann überall dort eingesetzt werden, wo die Verwendung der erweiterten Klasse oder des Records zulässig ist. Der Gültigkeitsbereich, den der Compiler für die Zuordnung verwendet, umfasst dann den ursprünglichen Typ sowie die unterstützende Klasse oder den Record.

Unterstützende Klassen und Records erweitern einen Typ, sollten aber nicht als Entwurfs-Tool für die Erstellung neuen Quelltexts eingesetzt werden. Bei neuem Quelltext sollten Sie immer auf die normale Klassenvererbung und die Interface-Implementierungen zurückgreifen.

Deklarationssyntax

Die Syntax für die Deklaration einer unterstützenden Klasse lautet:

type 
   Bezeichnername = class|record helper [(Vorfahrenliste)] for TypBezeichnername 
       MemberListe 
     end;

Die Vorfahrenliste ist optional.

Ein unterstützender Typ kann keine Instanzdaten deklarieren. Klassenfelder sind aber zulässig.

Hinsichtlich der Sichtbarkeit und der Syntax für die MemberListe gelten dieselben Regeln wie für normale Klassen- und Record-Typen.

In einem Typ können mehrere unterstützende Typen definiert und verknüpft werden. An einer Stelle im Quelltext kann aber jeweils nur ein unterstützender Typ angegeben werden. Es wird der Typ verwendet, der im Gültigkeitsbereich zuerst gefunden wird. Der Gültigkeitsbereich für unterstützende Klassen oder Records wird - wie in Object Pascal üblich - bestimmt (die uses-Klausel der Unit wird von rechts nach links ausgewertet).

Verwendung von unterstützenden Klassen

Das folgende Beispiel veranschaulicht die Deklaration einer unterstützenden Klasse (unterstützende Records verhalten sich ebenso):

 
 type 
    TMyClass = class 
       procedure MyProc; 
       function  MyFunc: Integer; 
    end;
 
    ...
 
    procedure TMyClass.MyProc; 
    var X: Integer; 
    begin 
       X := MyFunc; 
    end;
 
    function TMyClass.MyFunc: Integer; 
    begin 
        ... 
    end;
 
 ...
 
 type 
    TMyClassHelper = class helper for TMyClass 
       procedure HelloWorld; 
       function MyFunc: Integer; 
    end;
 
    ...
 
    procedure TMyClassHelper.HelloWorld; 
    begin 
       Writeln(Self.ClassName); // Self bezieht sich auf TMyClass, nicht auf TMyClassHelper 
    end;
 
    function TMyClassHelper.MyFunc: Integer; 
    begin 
      ... 
    end;
 
 ...
 
 var 
   X: TMyClass; 
 begin 
   X := TMyClass.Create; 
   X.MyProc;    // Aufruf von TMyClass.MyProc 
   X.HelloWorld; // Aufruf von TMyClassHelper.HelloWorld 
   X.MyFunc;    // Aufruf von TMyClassHelper.MyFunc

Aufgerufen wird die Funktion MyFunc der unterstützenden Klasse, da diese Vorrang vor dem eigentlichen Klassentyp hat.

Siehe auch