【发布时间】:2011-10-28 06:51:02
【问题描述】:
我一直认为接口是一种为不同的不相关类提供通用功能的方法。但是接口的属性 - “当 RefCOunt 降至零时释放对象”不允许我按我的意愿工作。
例如:假设我有两个不同的类:TMyObject 和 TMyDifferentObject。他们都支持这个接口:
const
IID_MyInterface: TGUID = '{4D91C27F-510D-4673-8773-5D0569DFD168}';
type
IMyInterface = Interface(IInterface)
['{4D91C27F-510D-4673-8773-5D0569DFD168}']
function GetID : Integer;
end;
type
TMyObject = class(TInterfacedObject, IMyInterface)
function GetID: Integer;
end;
function TMyObject.GetID: Integer;
begin
Result := 1;
end;
type
TMyDifferentObject = class(TInterfacedObject, IMyInterface)
function GetID: Integer;
end;
function TMyDifferentObject.GetID: Integer;
begin
Result := 2;
end;
现在,我想在我的程序中创建这些类的实例,然后将这些实例传递给这个方法:
procedure ShowObjectID(AObject: TObject);
var
MyInterface: IMyInterface;
begin
if Supports(AObject, IID_MyInterface, MyInterface) then
begin
ShowMessage(IntToStr(MyInterface.GetID));
end;
end; //Interface goes out of scope and AObject is freed but I still want to work with that object!
这是一个例子。一般来说,我想将对象的实例传递给某个过程并检查该对象是否支持接口,如果是,我想执行该接口的方法。但是当接口超出范围时,我不想完成该对象的工作。如何做到这一点?
问候。
【问题讨论】:
-
您可以禁用引用计数。看看 IInterface 在 TComponent 中是如何实现的。
标签: delphi interface delphi-2009