Unterstützende Klassen und Records (Delphi)

Aus RAD Studio
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
   identifierName = class|record helper [(ancestor list)] for TypeIdentifierName
     memberList
   end;

Die Vorfahrenliste ist optional. Sie kann nur für unterstützende Klassen angegeben werden.

Eine unterstützende Klasse 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.

Hinweis: Unterstützende Klassen und Records unterstützen überladene Operatoren nicht.

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 Delphi ü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 refers to TMyClass type, not TMyClassHelper
    end;
 
    function TMyClassHelper.MyFunc: Integer;
    begin
      ...
    end;
 
 ...
 
 var
   X: TMyClass;
 begin
   X := TMyClass.Create;
   X.MyProc;    // Calls TMyClass.MyProc
   X.HelloWorld; // Calls TMyClassHelper.HelloWorld
   X.MyFunc;    // Calls TMyClassHelper.MyFunc
Tipp: Denken Sie daran, dass die Funktion MyFunc der unterstützenden Klasse aufgerufen wird, da diese Vorrang vor dem eigentlichen Klassentyp hat.

Unterstützende Klassen und Records funktionieren nicht, wenn intrinsische Typen/Aufzählungstypen erweitert werden sollen. Zum Beispiel:

type
    TMyEnum = (one, two, three);
    TMyEnumHelper = record helper for TMyEnum
      function GetNext: TMyEnum;
    end;

Siehe auch