加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 如何检查一个类是否实现了一个接口,尊重超集?

发布时间:2020-12-15 09:38:55 所属栏目:大数据 来源:网络整理
导读:我正在学习COM和接口,并有以下实验代码: type IA = interface(IInterface) ['{C9C5C992-3F67-48C5-B215-7DCE6A61F0E8}'] end; IB = interface(IA) ['{F1799437-AD12-471B-8716-F1D93D1692FC}'] end; IC = interface(IB) ['{01780E8C-C47D-468E-8E42-4BFF3F4
我正在学习COM和接口,并有以下实验代码:

type
  IA = interface(IInterface)
  ['{C9C5C992-3F67-48C5-B215-7DCE6A61F0E8}']
  end;

  IB = interface(IA)
  ['{F1799437-AD12-471B-8716-F1D93D1692FC}']
  end;

  IC = interface(IB)
  ['{01780E8C-C47D-468E-8E42-4BFF3F495D51}']
  end;

  TBO = class(TInterfacedObject,IB)
  end;

procedure TForm1.FormCreate(Sender: TObject);
var
  x: TBO;
  a: IInterface;
begin
  x := TBO.Create;
  IInterface(x)._AddRef;

  if Assigned(TBO.GetInterfaceEntry(IA)) then memo1.lines.add('GetInterfaceEntry IA: OK'); // Why not?
  if Assigned(TBO.GetInterfaceEntry(IB)) then memo1.lines.add('GetInterfaceEntry IB: OK');
  if Assigned(TBO.GetInterfaceEntry(IC)) then memo1.lines.add('GetInterfaceEntry IC: OK');

  if x.QueryInterface(IA,a)=S_OK then memo1.lines.add('QueryInterface TA: OK'); // Why not?
  if x.QueryInterface(IB,a)=S_OK then memo1.lines.add('QueryInterface TB: OK');
  if x.QueryInterface(IC,a)=S_OK then memo1.lines.add('QueryInterface TC: OK');

  if Supports(TBO,IA) then memo1.lines.add('Supports TA: OK'); // Why not?
  if Supports(TBO,IB) then memo1.lines.add('Supports TB: OK');
  if Supports(TBO,IC) then memo1.lines.add('Supports TC: OK');

  if Supports(x,IA,a) then memo1.lines.add('Supports(2) TA: OK'); // Why not?
  if Supports(x,IB,a) then memo1.lines.add('Supports(2) TB: OK');
  if Supports(x,IC,a) then memo1.lines.add('Supports(2) TC: OK');
end;

输出:

GetInterfaceEntry IB: OK
QueryInterface TB: OK
Supports TB: OK
Supports(2) TB: OK

但是我需要:

GetInterfaceEntry IA: OK
GetInterfaceEntry IB: OK
QueryInterface TA: OK
QueryInterface TB: OK
Supports TA: OK
Supports TB: OK
Supports(2) TA: OK
Supports(2) TB: OK

据我所知,由于接口继承,IB是IA的超集.据我所知,由于TBO实现IB,它会自动实现IA.但是为什么Supports(),QueryInterface(),GetInterfaceEntry()返回false?

如何直接或间接地,即通过实施IA的超集,如何查询TBO?我需要两者,一个像GetInterfaceEntry这样的静态类函数和一个像QueryInterface这样的动态对象引用变量.

解决方法

这是德尔福的一个着名的怪癖.尽管IB继承自IA,但TBO必须明确指定IA和IB,以便Supports()检索两个接口.

TBO = class(TInterfacedObject,IB)

我忘了这个的技术原因.与编译器如何为TBO生成接口表的限制有关.它不会自动包含继承的接口.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读