我的接口有一个小问题.这是伪代码:
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;
任何人都可以看到这个缺陷吗?我需要孩子引用它的父级,但引用计数在这种情况下不起作用.如果我创建一个ParentClass实例,并添加一个子类,那么父类永远不会被释放.我明白为什么.我怎么绕圈呢?
引用计数引用具有两个语义:它作为所有权的共享以及导航对象图的方式.
通常,您不需要在引用图的循环中的所有链接上同时使用这两种语义.也许只有父母自己的孩子,而不是相反?如果是这种情况,您可以通过将它们存储为指针来使子引用父弱链接,如下所示:
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;
如果保证实例树的根在某处保持活动,这是安全的,即您不依赖于仅保留对树的分支的引用并且仍然能够导航它的整个部分.