gpt4 book ai didi

delphi - 向非接口(interface)派生对象添加接口(interface)

转载 作者:行者123 更新时间:2023-12-03 19:30:51 25 4
gpt4 key购买 nike

我有以下问题,我无法完全解决问题。假设我有一些类(class):

TClassA = class 
TClassB = class( TClassA )

IMyList = interface( IXList<TClassB> )
TMyList = class( TXList<TClassB>, IMyList )

TMyThing1 = class( TClassB )
TListOfMyThing1 = class( TMyList )

TMyThing2 = class( TClassB )
TListOfMyThing2 = class( TMyList )

TListOfMyThingLists = class( TXList<TMyList> )

基本上,我有一个基础对象 (TClassB) 和几个派生自它的类。我还有一个包含这些对象的基本列表对象 (TMyList)。

每个派生对象都有一个从基础容器派生的容器。

最后,我有一个列表列表,我在其中添加了每个列表。

这个想法是能够遍历列表列表,然后遍历每个列表并应用所有列表通用的方法:解析、验证、渲染等。

它编译良好并运行......直到它关闭,当我得到一些 GPF 时,内存转储显示大量内存泄漏。我想这是在一个继承级别使用接口(interface)的副作用,但不会超出该继承级别(即 IMyList/TMyList)。

我被难住的地方是如何为后两组类添加接口(interface)。 TClassB 是从 TObject 派生的,其中没有接口(interface)。我认为我需要的(至少是显而易见的)是这样的:
IMyThing1 = interface( TClassB, IInterface )
TMyThing1 = class( TClassB, TInterfacedObject, IMyThing1 )

但这不合法! (这是多重继承。糟糕!)

如果我只是使用从 TClassB 派生的合法内容:
IMyThing1 = interface( TClassB, IInterface )
TMyThing1 = class( TClassB, IMyThing1 )

编译器(DXE5)提示:
[dcc32 Error] x.pas(#): E2291 Missing implementation of interface method IInterface.QueryInterface
[dcc32 Error] x.pas(#): E2291 Missing implementation of interface method IInterface._AddRef
[dcc32 Error] x.pas(#): E2291 Missing implementation of interface method IInterface._Release

虽然线#在某处的杂草中关闭。 (IOW,它实际上并没有告诉我错误在哪里。我只能通过有选择地注释掉代码来确定。)

是否有必要为从非接口(interface)类派生的每个类显式实现这些接口(interface)函数,以防止“托管”对象被“管理不当”?

或者也许还有另一种不那么明显的方法?

(这似乎是一个问题,主要是因为 Borland-Inprise-CG-EMBT 的人们对实现“真正的”多重继承有着根本的宗教反对,因为愚蠢的人可以用它做愚蠢的事情......)

顺便说一句,这只是为了将自动引用计数(ARC)添加到类中而做的大量工作!

注意:这可能已在较早时得到回答,但我不知道如何表达问题以使其出现在搜索中。

最佳答案

混合接口(interface)对象指针和非接口(interface)对象指针不是一个好主意,尤其是当您从非接口(interface)对象指针检索接口(interface)时。如果你使用接口(interface),你应该对所有东西都使用接口(interface),包括变量和容器内部。话虽如此,要使此代码正常工作而不会崩溃,您可能必须覆盖 _AddRef()_Release()在实现接口(interface)的类上禁用引用计数。 TComponent例如,这样做。

关于delphi - 向非接口(interface)派生对象添加接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24646010/

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