Delphi 为什么';当通过元类工厂实例化时,派生构造函数是否被调用?
我试图在Delphi2007中创建一个类工厂。我想将派生类类型传递到函数中,并让它构造该类类型的对象 我已经找到了一些很好的参考资料,例如,但是我仍然不能让它正常工作。在下面的测试中,我无法让它调用派生构造函数,即使调试器告诉我oClass是tmydrive 我想我对一些基本的东西感到困惑,需要一些解释。谢谢Delphi 为什么';当通过元类工厂实例化时,派生构造函数是否被调用?,delphi,class,constructor,Delphi,Class,Constructor,我试图在Delphi2007中创建一个类工厂。我想将派生类类型传递到函数中,并让它构造该类类型的对象 我已经找到了一些很好的参考资料,例如,但是我仍然不能让它正常工作。在下面的测试中,我无法让它调用派生构造函数,即使调试器告诉我oClass是tmydrive 我想我对一些基本的东西感到困惑,需要一些解释。谢谢 program ClassFactoryTest; {$APPTYPE CONSOLE} uses SysUtils; // BASE CLASS type TMyBase =
program ClassFactoryTest;
{$APPTYPE CONSOLE}
uses
SysUtils;
// BASE CLASS
type
TMyBase = class(TObject)
bBaseFlag : boolean;
constructor Create; virtual;
end;
TMyBaseClass = class of TMyBase;
constructor TMyBase.Create;
begin
bBaseFlag := false;
end;
// DERIVED CLASS
type
TMyDerived = class(TMyBase)
bDerivedFlag : boolean;
constructor Create;
end;
constructor TMyDerived.Create;
begin
inherited;
bDerivedFlag := false;
end;
var
oClass: TMyBaseClass;
oBaseInstance, oDerivedInstance: TMyBase;
begin
oClass := TMyBase;
oBaseInstance := oClass.Create;
oClass := TMyDerived;
oDerivedInstance := oClass.Create; // <-- Still calling Base Class constructor
end.
程序类工厂测试;
{$APPTYPE控制台}
使用
SysUtils;
//基类
类型
TMyBase=class(TObject)
bbbaseflag:布尔型;
构造函数创建;事实上的
结束;
TMyBase类=TMyBase的类;
构造函数TMyBase.Create;
开始
bBaseFlag:=假;
结束;
//派生类
类型
tmydrived=class(TMyBase)
b驱动标志:布尔值;
构造函数创建;
结束;
构造函数tmydrived.Create;
开始
继承;
b驱动标志:=假;
结束;
变量
oClass:TMyBaseClass;
Obseinstance、oDerivedInstance:TMyBase;
开始
oClass:=TMyBase;
oBaseInstance:=oClass.Create;
oClass:=tMyDrived;
ODeriveInstance:=oClass.Create;// 您忽略了在派生类构造函数上指定override
。(我希望编译器会发出关于隐藏基类方法的警告。)添加该警告,您将看到tmydrived.Create
called
TMyDerived = class(TMyBase)
bDerivedFlag : boolean;
constructor Create; override;
end;
另一种选择是,由于构造函数不带任何参数,所以放弃虚拟构造函数,只覆盖AfterConstruction
+1,但是就是放弃虚拟构造函数,而只是覆盖后期构造。
呃,这是多么令人困惑的非标准。请坚持使用构造函数使用AfterConstruction
的唯一问题是它没有明确目的。子类化和添加非重写构造函数将很容易。虚拟构造器可以清楚地说明这一点。也就是说,如果你犯了这个错误,你的代码将无法工作,我一直认为这是一个极好的安全网!