2011-05-06 47 views
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. 

回答

13

您忽略在派生类构造函数中指定override。 (我希望编译器有关隐藏基类方法的警告。)补充说,你应该看到调用TMyDerived.Create

TMyDerived = class(TMyBase) 
    bDerivedFlag : boolean; 
    constructor Create; override; 
end; 

的选择,因为你的构造函数不带参数,是放弃虚拟构造,只是覆盖AfterConstruction

+2

+1,但是...'是要放弃虚拟构造函数,并且只是覆盖AfterConstruction。“哦,非常混乱,非标准。请坚持使用构造函数 – Johan 2011-05-06 21:53:01

+1

为此,使用'AfterConstruction'的唯一问题是它没有使意图清晰。子类化和添加非覆盖构造函数将很容易。一个虚构的构造器使这一点变得清楚这就是说,如果你犯了这个错误,你的代码将无法工作,我总觉得它是一个很好的安全网! – 2011-05-06 22:03:30

相关问题