【发布时间】:2013-05-25 04:29:42
【问题描述】:
具有如下所示的简单对象层次结构
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),覆盖 - 创建(年龄:整数) - 创建(有骨:整数)
human:=THuman.Create( <=====in there I have 5 suggestion constructor
为什么我有这种奇怪的行为?如何解决它,因为它太烦人了,我不能总是检查我需要实例化的类,如果我像下面这样实例化
human:=THuman.Create(); <===== it doesnt give me error
我如何完全隐藏我的anchestor 构造函数? ,因为如果我像上面那样实例化,完全给我一个错误的对象
更新:我也可以看到默认的 Create without parameter from TObject
【问题讨论】:
-
你有太多的虚拟构造函数。你只需要其中一个。
-
您确定需要任何虚拟构造函数吗?您是否曾经在编译时不知道类型的情况下实际实例化这些类中的任何一个?如果没有,那么你不需要虚拟构造函数。
-
这里很难给你建议,因为我们不知道是什么驱使你拥有这么多的重载和虚拟构造函数。从表面上看,你的整个设计都很有味道。我的直觉是修复设计将解决问题。试图隐藏构造函数类似于将衣夹放在鼻子上。设计仍然很臭,你再也闻不到了。
-
ok,我更新了我的问题以明确我的观点,因为实际上在我的代码中,两个构造函数都有完全不同的参数,有时我需要从基类重写两个构造函数,有时我只使用构造函数从基类。当然我可以将另一个构造函数重命名为 CreateByWhereLive 或其他不同的东西来解决这个问题,我可以让它正常工作,但是如果我使用“创建”,我不明白为什么它会有这样的行为......
-
我需要所有的重载和虚拟构造函数。我不同意。您不应拥有多个虚拟构造函数。如果你这样做了,你的设计是错误的。
标签: delphi methods overriding virtual overloading