[教程]判断两个不同的接口实例是否是同一个对象

如果一个对象支持多个接口,当我们获取其支持的不同接口的实例时,就会得到不同的地址,比如:

type
  IA=interface
  ['{CB36F22E-E44C-4842-8198-7487806A3617}']
  ...
  end;
  
  IB=interface
  ['{06949AE4-97F9-48C9-9E47-21E29F396DF7}']
  ...
  end;
  
  TABObject=class(TInterfacedObject,IA,IB)
  ...
  end;

我们假设对象 TABObject 的实例 ab,当我们写下类似于下面的代码时:

var
  A:IA;
  B:IB;
begin
  A:=ab;
  B:=ab;
  if Pointer(A)=Pointer(B) then
    ....
end;

在实际运行中,A 和 B 虽然是同一个实例 ab,但当我们调用时,会发现 A 和 B 并不是同一个地址,所以 if 语句条件判断永远是假,如果我们需要判断两个是否是同一个对象生成的,有两种办法:

1、转换为对象后再比较

与接口不同,Delphi 中的对象无论是子类还是父类,使用的地址都是同一个,所以下面的代码是没有问题的,不过仅支持 Delphi 的对象实例:

if (A as TObject)=(B as TObject) then

2、转换为基准的 IInterface ,也就是 IUnknown 接口,同一个对象如果查询 IInterface 接口返回的地址是相同的。不要试图用下面的代码:

if IInterface(ARoot)=IInterface(FDocument.Units) then

这代码并不会触发 QueryInterface 查询最基准的 IInterface 接口地址,所以一样不行。所以正确的代码是:

if (A as IInterface)=(B as IInterface) then

好吧,到现在这一步,基本上就差不多了。进一步完善下的话,自己想吧。

 

滚动至顶部