如果一个对象支持多个接口,当我们获取其支持的不同接口的实例时,就会得到不同的地址,比如:
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
好吧,到现在这一步,基本上就差不多了。进一步完善下的话,自己想吧。