gpt4 book ai didi

delphi - 接口(interface) "recursion"和引用计数

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

我在界面方面遇到了一个小问题。这是伪代码:

type
Interface1 = interface
end;

Interface2 = interface
end;

TParentClass = class(TInterfacedObject, Interface1)
private
fChild : Interface2;
public
procedure AddChild(aChild : Interface2);
end;

TChildClass = class(TInterfacedObject, Interface2)
private
fParent : Interface2;
public
constructor Create(aPArent : Interface1);
end;

谁能看出这个缺陷吗?我需要 child 有对其 parent 的引用,但引用计数在这种情况下不起作用。如果我创建一个 ParentClass 实例,并添加一个子类,那么父类永远不会被释放。我明白为什么。我该如何绕过它?

最佳答案

引用计数引用有两种语义:它充当所有权份额以及导航对象图的手段。

通常,您不需要在引用图中的循环中的所有链接上同时使用这些语义。也许只有 parent 才有 child ,而不是相反?如果是这种情况,您可以通过将父弱链接存储为指针来使子引用指向父弱链接,如下所示:

TChildClass = class(TInterfacedObject, Interface2)
private
fParent : Pointer;
function GetParent: Interface1;
public
constructor Create(aPArent : Interface1);
property Parent: Interface1 read GetParent;
end;

function TChildClass.GetParent: Interface1;
begin
Result := Interface1(fParent);
end;

constructor TChildClass.Create(AParent: Interface1);
begin
fParent := Pointer(AParent);
end;

如果保证实例树的根在某个地方保持事件状态,即您不依赖于仅保留对树的分支的引用并且仍然能够导航整个树,那么这是安全的。

关于delphi - 接口(interface) "recursion"和引用计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/171730/

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