6
我试图创建我所了解的Delphi 2007中的类工厂。我想将派生类类型传递给函数,并让它构造该类类型的对象。为什么在通过元类类工厂实例化时不会调用派生构造函数?
我发现了一些很好的参考文献,如How can I create an Delphi object from a class reference and ensure constructor execution?,但我仍然无法让它工作得很正确。在下面的测试中,即使调试器告诉我oClass是TMyDerived,我也无法调用派生的构造函数。
我想我对这里的一些基本知识感到困惑,可以使用一些解释。谢谢。
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.
+1,但是...'是要放弃虚拟构造函数,并且只是覆盖AfterConstruction。“哦,非常混乱,非标准。请坚持使用构造函数 – Johan 2011-05-06 21:53:01
为此,使用'AfterConstruction'的唯一问题是它没有使意图清晰。子类化和添加非覆盖构造函数将很容易。一个虚构的构造器使这一点变得清楚这就是说,如果你犯了这个错误,你的代码将无法工作,我总觉得它是一个很好的安全网! – 2011-05-06 22:03:30