2014-09-20 9 views
5

Alle der Dokumentation Versionen, einschließlich the one most up to date gibt die folgende Klasse/record Helfer Syntax:Was ist der Zweck der "Vorfahrenliste" in der Klassenhelfer-Syntax? Wo ist es dokumentiert? Gibt es ein Anwendungsbeispiel?

type 
    identifierName = class|record helper [(ancestor list)] for TypeIdentifierName 
    memberList 
    end; 

Und es erklärt nur das, was ...

Die Ahnenliste ist optional. Es kann nur für den Klassenhelfer angegeben werden.

... und geht nicht weiter in die Details. Ein Anwendungsbeispiel im Rest der Dokumentationsthematik nutzt lediglich die Tatsache aus, was ancestor list optional ist. Der gesamte EMBA-Code, den ich gesehen habe, sowie der gesamte Code von Drittanbietern verwenden diesen ancestor list-Teil nicht.

So sind meine Fragen im Titel beschrieben:

  • Was ist der Zweck von ancestor list in der Klasse Helfer Syntax?
  • Wo ist es dokumentiert?
  • Gibt es Anwendungsbeispiele?

Antwort

4

Es ermöglicht die Vererbung von Helfern:

{$APPTYPE CONSOLE} 

type 
    TObjectHelper = class helper for TObject 
    procedure Foo; 
    end; 

    TObjectHelperAgain = class helper(TObjectHelper) for TObject 
    procedure Bar; 
    end; 

procedure TObjectHelper.Foo; 
begin 
    Writeln('Foo'); 
end; 

procedure TObjectHelperAgain.Bar; 
begin 
    Writeln('Bar'); 
end; 

begin 
    with TObject.Create do 
    begin 
    Foo; 
    Bar; 
    end; 
end. 

Dies ist eine Möglichkeit, um die Einschränkung zu umgehen, dass es nur ein einziger Helfer aktiv zu einer bestimmten Code Lage sein kann.

Soweit ich sagen kann, gibt es keine Dokumentation für die Vorfahrenliste.

+0

FWIW, der abgeleitete Objekthelfer kann auch ein Helfer für eine *** abgeleitete *** Klasse sein. IOW, das funktioniert auch (kompiliert und erzeugt erwartetes Ergebnis): 'TObjectHelperAgain = Klassenhelfer (TObjectHelper) für TList'. Habe es einfach ausprobiert. Natürlich würde ich es dann 'TListHelper' nennen. –

+0

@rudy vermutlich der Compiler würde überprüfen, dass die Helpees durch Vererbung in der offensichtlichen Weise verwandt sind. –

+2

Aber 'TStreamHelper = Klassenhelfer (TListHelper) für TStream' wird nicht kompiliert. Es muss also dieselbe oder eine abgeleitete Klasse sein, der geholfen wird, und "TSTream" leitet sich nicht von "TList" ab. –