2009-03-18 11 views
2

In einer Datei, ich habe eine Basisklasse mit einer ID-Eigenschaft:Delphi: Eigenschaften mit demselben Namen in der Klasse absteigend

type 
    TBase = class(TObject) 
    private 
    FID: integer; 
    public 
    property ID: integer read FID write SetID; 
    end; 

In einer zweiten Datei, ich habe eine andere Klasse von TBase absteigend. Durch Zufall, oder Ignoranz oder was auch immer, ein neues Eigentum/Feld mit dem gleichen Namen als existierendes Eigentum/Feld wurde gemacht.

Die zweiten ID-Felder werden natürlich umbenannt, aber warum erlaubt der Compiler das?
Beim Zugriff auf die ID im Code - welches ID-Feld wird verwendet?

Antwort

11

Delphi ermöglicht es, Ihre alten Eigenschaften zu "verstecken" und Eigenschaften mit dem gleichen Namen einzuführen, die anders funktionieren. Ich habe dies zum Beispiel verwendet, um meine eigenen typsichere TList Nachkommen für eine bestimmte Klasse oder Datensatz zu erstellen:

type 
    TMyList = class(TList) 
    private 
    function GetItem(Index: Integer): TMyObject; 
    procedure SetItem(Index: Integer; Value: TMyObject); 
    public 
    property Items[Index: Integer]: TMyObject read GetItem write SetItem; 
    end; 

    function TMyList.GetItem(Index: Integer): TMyObject; 
    begin 
    Result := TMyObject(inherited Items[Index]); 
    end; 

    procedure SetItem(Index: Integer; Value: TMyObject); 
    begin 
    inherited Items[Index] := Value; 
    end; 

Ofcourse, mit Delphi 2009 und Generika, es ist jetzt viel einfacher.

Die ID, auf die Sie zugreifen, hängt von der Stelle ab, von der aus Sie anrufen.

procedure TSub.Foo; 
begin 
    ID := 5; //TSub.ID 
    inherited ID := 6 //TBase.ID 
end; 

procedure TBase.FooBar; 
begin 
    ID := 5; //TBase.ID 
end; 

var 
    Sub: TSub; 
    Base: TBase; 
begin 
    Sub := TSub.Create; 
    try 
    Sub.ID := 1; //assign 1 to TSub.ID 
    TBase(Sub).ID := 2; //assign 2 to TBase.ID 
    WriteLn(Sub.ID); //writes 1 
    WriteLn(TBase(Sub).ID); //writes 2 
    Base := Sub; 
    WriteLn(Base.ID); //writes 2 
    finally 
    Sub.Free; 
    end; 
end; 
+0

Bitte verwenden Sie nicht "überschreiben", um dies zu beschreiben. Das deutet darauf hin, dass etwas mit virtuellen Funktionen und Polymorphie zu tun hat, aber das ist nicht der Fall. Eine Variable vom Typ TList greift immer auf die Items-Eigenschaft von TList zu, selbst wenn die Variable eine Instanz der TMyList-Klasse enthält. Ein besseres Wort ist "verstecken". –

+0

Sie haben Recht, ich habe meine Antwort ein wenig geändert. –

+0

Wiedereinführung ist ein besseres Wort dafür. –

Verwandte Themen