delphi – 防止破坏接口传递的对象
发布时间:2020-12-15 09:22:19 所属栏目:大数据 来源:网络整理
导读:我对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 M
|
我对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;
有一个视图可以显示实现IListModel接口的对象. 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;
我想知道什么是解决这个问题的最佳方法. 在这种情况下使用接口的最佳方法是什么? 编辑: 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;
这个实现好吗? 解决方法
如果要使用接口附带的引用计数,则只应通过接口引用该对象.除了通过接口之外没有对象的引用,也不会自己释放对象.
或者您可以通过重写_AddRef和_Release来禁用引用计数,并像您习惯的那样销毁对象.这就是TComponent所做的. 或者保持引用计数,但是当您像对象一样引用它时调用AddRef和Release. 编辑 使用const参数可以防止引用计数更新并加快代码速度: constructor Create(const model : IListModel); reintroduce; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
