delphi重载,覆盖,虚方法

nav*_*ius 5 delphi methods virtual overriding overloading

有如下的简单对象层次结构

TLiveThing=class
protected
 FTest:string;
 constructor Create(whereLive:string);overload;virtual;
 constructor Create(haveBone:Boolean);overload;virtual;
end;

THuman=class(TLiveThing)
public
 constructor Create(whereLive:string);overload;override;
 constructor Create(age:integer);overload;
end;
Run Code Online (Sandbox Code Playgroud)

在理论上,如果我实例化THuman,我有2个构造函数,但实际上我有5个构造函数通过代码洞察显示,实际上我想看到3个构造函数, - Create(whereLive:String),overriden - Create(age:integer) - 创建(haveBone:整数)

human:=THuman.Create(       <=====in there I have 5 suggestion constructor
Run Code Online (Sandbox Code Playgroud)

为什么我有这种奇怪的行为?如何解决它,因为它太烦人了,我总是检查我的类,我需要实例化,如果我实例化如下

human:=THuman.Create(); <===== it doesnt give me error
Run Code Online (Sandbox Code Playgroud)

我如何完全隐藏我的anchestor构造函数?,因为如果我像上面那样实例化,完全给我一个错误的对象

更新:我也可以在TObject中看到默认的Create参数

Pet*_*ter 1

如果不把重点放在糟糕的构造函数实现上,

您的问题是祖先类和子类都在同一单元中定义,因此 Private/Protected 的标准定义在这里不适用。

如果您想防止祖先构造函数(您在子类中重写)在实例化该派生类的对象时显示为代码参数,那么只需将其设为严格 受保护或严格 私有部分的成员即可。

以你的例子:

TLiveThing=class
strict protected
 constructor Create(whereLive:string); virtual;
end;

THuman=class(TLiveThing)
public
 constructor Create(whereLive:string); overload; override;
 constructor Create(age:integer); overload;
end;
Run Code Online (Sandbox Code Playgroud)

当您创建子类的实例时,这将防止祖先构造Create(whereLive:string)函数显示为参数。

正如 David 所指出的,这与隐藏默认的 Create 构造函数无关,它仅适用于隐藏自定义构造函数。