gpt4 book ai didi

delphi - 使用虚拟构造函数重置为初始状态

转载 作者:行者123 更新时间:2023-12-03 15:53:24 24 4
gpt4 key购买 nike

我对 Delphi 中提供的虚拟构造函数没有任何经验。我考虑在类层次结构中使用虚拟构造函数将实例重置为初始状态,如下所示:

A = class
end;
B = class(A)
end;
C = class(B)
end;

FooA = class
a_ : A;
constructor Create(inst : A); overload;
constructor Create; overload; virtual; abstract;
destructor Destroy; override;
function Bar : A;
end;

FooB = class(FooA)
b_ : B;
constructor Create; override;
constructor Create(inst : B); overload;
end;

FooC = class(FooB)
// ...
end;

{ FooA }
constructor FooA.Create(inst: A);
begin
inherited Create;
a_ := inst;
end;

destructor FooA.Destroy;
begin
FreeAndNil(a_);
inherited;
end;

function FooA.Bar : A;
begin
Result := a_;
a_ := nil;

// here comes the magic
Self.Create;
end;

{ FooB }
constructor FooB.Create;
begin
b_ := B.Create;
inherited Create(b_);
end;

constructor FooB.Create(inst: B);
begin
inherited Create(inst);
b_ := inst;
end;
{ FooC } // ...

var
fc : FooA;
baz : A;
begin
fc := FooC.Create;
baz := fc.Bar;
WriteLn(baz.ClassName);
FreeAndNil(baz);
FreeAndNil(fc);
ReadLn;
end.

这个设计有什么问题/陷阱吗?这个简单的例子就像一个魅力,但我觉得像这样调用构造函数(不构造任何东西)有点不安。

编辑:

我决定将初始化移至保护区中具有有意义名称的方法,这让我感觉更好;-)

FooA = class
strict private
a_ : A;
strict protected
procedure SetInst; overload; virtual; abstract;
procedure SetInst(i : A); overload;
public
constructor Create;
destructor Destroy; override;
function Foo : A;
end;

最佳答案

很少有类被编写为支持使用构造函数作为重新初始化程序。他们通常假设任何动态分配的内存都尚未分配。如果您可以控制正在使用的所有类,那么请继续小心地使用构造函数作为重新初始化程序。

即使您可以控制,我仍然建议您不要这样做。 这不是 Delphi 惯用的;其他阅读你的代码的人(也许甚至是你,几周或几个月后)都会对你对构造函数的非标准使用感到困惑,至少在一开始是这样。不值得这么麻烦。如果调用 Bar 函数应该释放 A 对象的所有权并创建一个新实例,则编写具有明确含义的名称的函数。

关于delphi - 使用虚拟构造函数重置为初始状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4377763/

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