相关疑难解决方法(0)

绕过(禁用)Delphi对接口的引用计数

对于我正在研究的应用程序架构中的一个特定问题,接口似乎是一个很好的解决方案.具体来说,一些"业务对象"依赖于从实际应用程序中的数据库中提取的一堆设置.让这些业务对象请求接口(通过控制反转),并让中央TDatabaseSettings对象实现这些接口,允许更好的隔离,从而更容易进行单元测试.

然而,在Delphi中,接口似乎带有一个令人不愉快的奖励:引用计数.这意味着,如果我这样做:

type
IMySettings = interface
    function getMySetting: String;
end;

TDatabaseSettings = class(..., IMySettings)
    //...
end;

TMyBusinessObject = class(TInterfacedObject, IMySettings)
    property Settings: IMySettings read FSettings write FSettings;
end;

var
  DatabaseSettings: TDatabaseSettings; 
    // global object (normally placed in a controller somewhere)

//Now, in some function...
O := TMyBusinessObject.Create;
O.Settings := DatabaseSettings; 
// ... do something with O
O.Free;
Run Code Online (Sandbox Code Playgroud)

在最后一行(O.Free)上,我的全局DatabaseSettings对象现在也被释放,因为它的最后一个接口引用(包含在其中O)丢失了!

一种解决方案是DatabaseSettings使用接口存储"全局" 对象; 另一种解决方案是覆盖类的引用计数机制TDatabaseSettings,因此我可以继续将其DatabaseSettings作为普通对象进行管理(这与应用程序的其余部分更加一致).

总而言之,我的问题是:如何禁用特定类的接口引用计数机制?

我已经能够找到一些建议覆盖IInterface …

delphi

10
推荐指数
3
解决办法
5284
查看次数

当没有更多的引用时,接口实现形式是否会自行释放?

如果我在一个表单上实现一个接口,TMyForm = class(TForm, IMyInterface)当没有更多的接口引用时,该对象是否会自行释放?似乎没有,虽然我无法弄清楚如何计算TForm(如果有的话).当接口引用超出范围时,我担心表单被释放,但这似乎不会发生.

我想这个问题有两个部分,首先是一个表单是否可能意外释放(真正的问题),其次是表单是如何计算引用的.

delphi interface tform

6
推荐指数
1
解决办法
940
查看次数

标签 统计

delphi ×2

interface ×1

tform ×1