Подтвердить что ты не робот

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"

Кроме того, он не скрывает это - он прямо там!

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

Какая сделка?

4b9b3361

Ответ 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;