delphi – 为什么在通过元类类工厂实例化时不会调用派生的构造函
发布时间:2020-12-15 04:27:41 所属栏目:大数据 来源:网络整理
导读:我正在尝试创建我所理解的Delphi 2007中的类工厂.我想将派生类类型传递给函数并让它构造该类类型的对象. 我找到了一些很好的参考资料,例如How can I create an Delphi object from a class reference and ensure constructor execution?,但我仍然无法让它工
我正在尝试创建我所理解的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. 解决方法
您忽略了在派生类构造函数上指定override. (我本来期望编译器发出关于隐藏基类方法的警告.)添加它,你应该看到调用了TMyDerived.Create.
TMyDerived = class(TMyBase) bDerivedFlag : boolean; constructor Create; override; end; 另一种选择,因为你的构造函数不带参数,就是放弃虚拟构造函数,只需覆盖AfterConstruction. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |