Delphi:方法'Create'隐藏了基础的虚拟方法 - 但它就在那里

Ian*_*oyd 20 delphi overloading

考虑假设的对象层次结构,从以下开始:

TFruit = class(TObject)
public
    constructor Create(Color: TColor); virtual;
end;
Run Code Online (Sandbox Code Playgroud)

及其后代:

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

这里的想法是我已经覆盖了基类的构造函数,其重载也恰好是虚拟的.

德尔福抱怨:

方法'Create'隐藏基类型'TFruit'的虚方法

除了它不隐藏它 - 它就在那里!

  • 覆盖了祖先中的虚拟方法,并且
  • 我用另一个版本重载了

这是怎么回事?

NGL*_*GLN 27

两种解决方案

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;
Run Code Online (Sandbox Code Playgroud)

要么:

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;
Run Code Online (Sandbox Code Playgroud)

  • +1.我找不到使`XE2编译器开心的`overload`,`virtual`和/或`override`的组合.:) (3认同)
  • 恕我直言,如果你需要重新介绍,你的代码闻起来很可怕. (2认同)
  • @WarrenP,`TComponent.Create`是一个多态构造函数,它是Delphi工作方式的核心.我觉得它很漂亮,我闻不到任何东西. (2认同)

Ken*_*ite 5

这似乎是一个"先到先得"的问题.(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;
Run Code Online (Sandbox Code Playgroud)