5

具有简单的对象层次结构,如下所示

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 个构造函数,- Create(whereLive:String),覆盖 - Create(age:integer) -创建(有骨:整数)

human:=THuman.Create(       <=====in there I have 5 suggestion constructor

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

human:=THuman.Create(); <===== it doesnt give me error

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

更新:而且我也可以从 TObject 中看到没有参数的默认创建

4

1 回答 1

1

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

您的问题是祖先类和子类都定义在同一个单元中,因此私有/受保护的标准定义在这里不适用。

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

用你的例子:

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 构造函数无关,它只适用于隐藏您的自定义构造函数。

于 2013-05-25T06:55:56.540 回答