gpt4 book ai didi

delphi - 防止接口(interface)传递的对象被破坏

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

我对 Delphi 和 Delphi 中的界面没有太多经验。

示例:

IListModel = interface
function At(row, col : Integer) : String;
end;

MyModel = class(TInterfacedObject, IListModel)
public
function At(row, col : Integer) : String;
procedure ManipulateA;
procedure ManipulateBogus;
end;

有一个 View 可以可视化实现 IListModel 接口(interface)的对象。

View = class(TForm)
public
constructor Create(model : IListModel); reintroduce;
end;

我的应用程序拥有一个 MyModel 实例

MyApp = class({...})
strict private
model : MyModel;
public
// ...
end;

在应用程序中,我创建模型并使用它。

procedure MyApp.LoadModel;
procedure MyApp.OnFoo;
begin
model.ManipulateBogus;
end;

现在,我想显示数据

procedure MyApp.ShowModel;
var
v : View;
begin
v := View.Create(model); // implicit to IListView > refCount=1
v.ShowModal;
FreeAndNil(v);
// refCount = 0
// oops, my model is dead now
end;

我想知道解决这个问题的最佳方法是什么。在 MyApp 中,我可以同时保留实例模型:MyModel 和通过 IListModel 接口(interface)。或者我可以引入一个新接口(interface) IMyModel 并通过该接口(interface)在 MyApp 类中保存模型。我必须在 ShowModel 方法中使用 if Supports(...) 来获取 IListModel 接口(interface)。或者我从另一个非引用基类(TInterfacedPersistent 或自己编写的类)派生 MyModel 类。还有其他想法吗?

在这种情况下使用界面的最佳方式是什么?

编辑:非引用计数基类:

function NonRefCountingObject.QueryInterface(const IID: TGUID;
out Obj): HResult;
begin
if GetInterface(IID, Obj) then
Result := S_OK
else
Result := E_NOINTERFACE;
end;

function NonRefCountingObject._AddRef: Integer;
begin
Result := -1; // no reference counting
end;

function NonRefCountingObject._Release: Integer;
begin
Result := -1; // no reference counting
end;

这个实现可以吗?

最佳答案

如果您想使用接口(interface)附带的引用计数,则应该仅通过接口(interface)引用该对象。除了通过接口(interface)之外,不引用该对象,并且不要自行释放该对象。

或者您可以通过重写 _AddRef 和 _Release 来禁用引用计数,并像您习惯的那样销毁对象。这就是 TComponent 的作用。

或者保留引用计数,但当像对象一样引用它时调用 AddRef 和 Release。

编辑

使用 const 参数可以防止引用计数更新并加快代码速度:

constructor Create(const model : IListModel); reintroduce;

关于delphi - 防止接口(interface)传递的对象被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4162530/

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