Unterstützende Klassen und Records (Delphi)
Nach oben zu Klassen und Objekte - Index
Dieses Thema befasst sich mit der Syntax für die Deklaration von unterstützenden Klassen.
Inhaltsverzeichnis
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. Sie kann nur für unterstützende Klassen angegeben werden.
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.
- 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 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.