Delphi: метод "Create" скрывает виртуальный метод базы - но он прямо там
Рассмотрим иерархию гипотетических объектов, начиная с:
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;
Идея здесь в том, что у меня переопределенный конструктор виртуальный базового класса с перегрузкой, который также является виртуальным.
Delphi жалуется:
Метод "Создать" скрывает виртуальный метод базового типа "TFruit"
Кроме того, он не скрывает это - он прямо там!
- я переопределить виртуальный метод в предке и
- я перегружен с другой версией
Какая сделка?
Ответы
Ответ 1
Два решения:
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;
Ответ 2
Похоже, что это "первая проблема". (Кажется, 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;