具有简单的对象层次结构,如下所示
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;
理论上,如果我实例化THuman,我有2个构造函数,但实际上我有5个构造函数通过代码洞察显示,实际上我想看到3个构造函数,
- 创建(whereLive:String),覆盖
- 创建(年龄:整数)
- 创建(haveBone:整数)
human:=THuman.Create( <=====in there I have 5 suggestion constructor
为什么我有这种奇怪的行为?如何解决它,因为它太烦人了,我总是检查我的类,我需要实例化,如果我实例化如下
human:=THuman.Create(); <===== it doesnt give me error
我如何完全隐藏我的anchestor构造函数? ,因为如果我像上面那样实例化,完全给我一个错误的对象
UPDATE :我也可以看到默认情况下创建没有来自TObject的参数
答案 0 :(得分:1)
不关注错误的构造函数实现,
你的问题是祖先和子类都是在同一单元中定义的,因此私有/受保护的标准定义在这里不适用。
如果你想阻止祖先构造函数(你在子类中重写)在实例化那个类的对象时显示为代码参数,那么只需使它成为 strict 的成员受保护或严格私人部分。
用你的例子:
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;
这将阻止祖先构造函数Create(whereLive:string)
在创建子类的实例时显示为参数。
正如大卫所指出的,这与隐藏默认的Create构造函数无关,它只适用于隐藏自定义构造函数。