加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读