2015-09-03 14 views
6

Dies könnte wie eine wirklich dumme Frage erscheinen, aber ich weiß nicht, warum dies auch zu kompilieren erlaubt ist:Warum erlaubt Delphi, dass Konstruktorparameter falsch sind?

program ConstructorWithParam; 

{$APPTYPE CONSOLE} 

uses 
    System.SysUtils; 

type 

    TThing = class(TObject) 
    private 
    FParent: TObject; 
    public 
    constructor Create(const AParent: TObject); 
    end; 

{ TThing } 

constructor TThing.Create; // <- WTF? Why does the compiler not complain? 
begin 
    FParent := AParent; 
end; 

var 
    Thing: TThing; 
begin 
    try 
    Thing := TThing.Create(TObject.Create); 
    Readln; 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
end. 

I Delphi XE5 bin mit und nicht auf anderen Versionen getestet. Danke.

Antwort

8

Die erste Deklaration in der Formularklasse wird als korrekt angenommen. Die Implementierungsversion muss die erforderlichen Parameter nicht identifizieren. Sie werden von der ursprünglichen Deklaration übernommen. Dies ist ein Teil der Sprache selbst.

Hier ist ein gutes Beispiel dafür, den Punkt zu veranschaulichen:

type 
    TMyClass = class (Tobject) 
    procedure DoSometimg(DoA, DoB: Boolean); 
    end; 

Umsetzung:

procedure TMyClass.DoSomething; // Note both parameters missing 
begin 
    if DoA then // Note not mentioned in implementation declaration 
    DoOneThing; // but still can be used here 
    if DoB then 
    DoAnotherThing; 
end; 

Ich persönlich bevorzugen sowohl die Implementierung und Interface-Deklarationen Spiel zu machen, denn es macht es einfacher, die zu identifizieren Parameter, ohne im Code-Editor so viel herumzuspringen.

+0

Danke Ken, ich benutze Delphi seit 15 Jahren und ich wusste das nicht! Und ich stimme zu - ich bevorzuge die Schnittstelle, um die Implementierung anzupassen. Ich nehme an, dass dies nur bei überladenen Methoden nicht der Fall ist? –

+2

TurboPASCAL 5.0 führte dies ein. –

+0

Beachten Sie, dass der Compiler das nur zulässt, wenn keine Parameter angegeben sind. Wenn sie angegeben sind, müssen sie übereinstimmen oder der Compiler wird sich beschweren. Dies war eine Sprachfunktion von Pascal, die vor Delphi war. –

Verwandte Themen