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

时间:2012-02-01 20:58:38

标签: delphi overloading

考虑假设的对象层次结构,从:

开始
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'的虚拟方法

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

  • 覆盖 祖先中的虚拟方法,
  • 重载 与其他版本

这是什么交易?

2 个答案:

答案 0 :(得分: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;

或者:

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;

答案 1 :(得分: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;