Delphi: свойства с тем же именем в нисходящем классе - PullRequest
2 голосов
/ 18 марта 2009

В одном файле у меня есть базовый класс с ID-свойством:

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

Во втором файле у меня есть другой класс, происходящий из TBase. Случайно, или по незнанию, или как-то еще, было создано новое свойство / поле с тем же именем, что и у существующего свойства / поля.

type
  TSub = class(TBase)
  private
    FID: Longword;
  public     
    property ID: Longword read FID write FID;
  end;

Вторые поля идентификаторов, конечно, переименованы, но почему компилятор допускает это?
При обращении к ID в коде - какое поле ID используется?

1 Ответ

11 голосов
/ 18 марта 2009

Delphi позволяет «скрывать» ваши старые свойства и вводить свойства с одинаковыми именами, которые работают по-разному. Я использовал это, например, для создания своих собственных безопасных потомков TList для определенного класса или записи:

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;

Конечно, с Delphi 2009 и дженериками, теперь стало намного проще.

Какой идентификатор вы используете, зависит от того, откуда вы звоните.

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