gpt4 book ai didi

delphi - 为什么在通过元类类工厂实例化时不调用派生构造函数?

转载 作者:行者123 更新时间:2023-12-03 14:57:20 27 4
gpt4 key购买 nike

我正在尝试在 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

关于delphi - 为什么在通过元类类工厂实例化时不调用派生构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5916101/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com