delphi重载、重写、虚拟方法

delphi重载、重写、虚拟方法,delphi,methods,overriding,virtual,overloading,Delphi,Methods,Overriding,Virtual,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);over

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

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;
human:=THuman.Create(); <===== it doesnt give me error
从理论上讲,如果我实例化THuman,我有2个构造函数,但实际上我有5个由code insight显示的构造函数,实际上我想看到3个构造函数, -创建(whereLive:String),重写 -创建(年龄:整数) -创建(haveBone:integer)


human:=THuman.Create(),而不关注糟糕的构造函数实现

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

如果要防止祖先构造函数(在子类中重写)在实例化该派生类的对象时显示为代码参数,则只需将其设置为strictprotected或strictprivate部分的成员

以你的例子:

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)
在创建子类实例时显示为参数


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

您的虚拟构造函数太多了。您只需要其中一个。您确定需要虚拟构造函数吗?您是否在不知道虚拟构造函数的情况下实例化过这些类中的任何一个在编译时键入?如果不需要,那么您就不需要虚拟构造函数。这里很难给您提供建议,因为我们不知道是什么驱使您拥有这么多重载和虚拟构造函数。从表面上看,您的整个设计都有异味。我的直觉是,修复设计将解决问题。尝试隐藏构造函数类似于p把衣服钉在鼻子上。设计仍然很臭,你再也闻不到了。好了,我更新我的问题来阐明我的观点,因为实际上在我的代码中,两个构造函数都有完全不同的参数,有时我需要重写基类中的两个构造函数,有时我只使用基类中的构造函数当然,我可以将另一个构造函数重命名为CreateByWhereLive或其他不同的方法来解决这个问题,我可以使它正常工作,但如果我使用“Create”,我不明白它为什么会有这样的行为…我需要所有的重载和虚拟构造函数。我不同意。你不应该有多个虚拟构造函数。如果你有,你的设计是错误的。这一点都没有帮助。无参数的
TObject.Create
通过引入重载的
Create
而变得可见>是的,但他说他想隐藏祖先构造函数Create(whereLive:string)这至少可以帮助他隐藏这一点。所以,这意味着,在delphi中,如果我在基类上有两个虚拟构造函数,那么派生类有一个构造函数,一个从基类重写,然后当我从派生类实例化对象时,我可以有4个构造函数,包括被重写的一个(我的问题是从我的代码中得到的经验)这是bug还是像那样?(因为我在c#上没有这样的行为)因为,实际上我不想隐藏一些严格私有的构造函数,我只想,那个构造函数被派生类重写,所以如果我实例化对象,我可以看到被重写的构造函数,只是派生对象的构造函数,我在delphi中的经验,代码洞察给我建议基类的构造函数和派生类的构造函数ss,虽然我已经忽略了constructor@navirius,strict这个词对方法的override指令没有影响,结果是一样的。我想你被我答案中隐藏的词弄糊涂了。你决定在派生类中重写的祖先虚拟构造函数仍然会被重写,strict这个词只是m表示如果父类和子类都在同一个单元中定义,则会消除您在实例化对象时遇到的混乱。您可以通过在单元1中编写父类和在单元2中编写子类来实现相同的结果。我将更新答案,希望您能接受。
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;