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 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
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;