Delphi: метод «Create» скрывает виртуальный метод base - но он тут же - PullRequest
20 голосов
/ 02 февраля 2012

Рассмотрим гипотетическую иерархию объектов, начиная с:

TFruit = class(TObject)
public
    constructor Create(Color: TColor); virtual;
end;

и его потомок:

TApple = class(TFruit)
public
    constructor Create(); overload; virtual;
    constructor Create(Color: TColor); overload; override; //deprecated. Calls other constructor - maintaining the virtual constructor chain
end;

Идея заключается в том, что я переопределил виртуальный конструктор базового класса с перегрузкой , которая также оказывается виртуальной.

Дельфи жалуется:

Метод «Создать» скрывает виртуальный метод базового типа «TFruit»

За исключением того, что это не скрывает это - это прямо там!

  • i переопределил виртуальный метод в предке и
  • i перегружен это с другой версией

В чем дело?

Ответы [ 2 ]

27 голосов
/ 02 февраля 2012

Два решения:

type
  TFruit = class(TObject)
  public
    constructor Create(Color: TColor); virtual;
  end;

  TApple = class(TFruit)
  public
    constructor Create(); reintroduce; overload;
    constructor Create(Color: TColor); overload; override;
  end;

Или:

type
  TFruit = class(TObject)
  public
    constructor Create; overload; virtual; abstract;
    constructor Create(Color: TColor); overload; virtual;
  end;

  TApple = class(TFruit)
  public
    constructor Create(); override;
    constructor Create(Color: TColor); override; 
  end;
5 голосов
/ 02 февраля 2012

Похоже, это проблема типа «который пришел первым». (Похоже, NGLN нашел решение.)

Есть и другое решение. Вы можете использовать параметр по умолчанию:

interface

type
  TFruit=class(TObject)
  public
    constructor Create(Color: TColor); virtual;
  end;

  TApple=class(TFruit)
  public
    constructor Create(Color: TColor = clRed); override;
  end;

implementation

{ TFruit }

constructor TFruit.Create(Color: TColor);
begin
  inherited Create;
end;

{ TApple }

constructor TApple.Create(Color: TColor);
begin
  inherited;
end;

// Test code
var
  AppleOne, AppleTwo: TApple;
begin
  AppleOne := TApple.Create;
  AppleTwo := TApple.Create(clGreen);
end;
...