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生成接口表的限制有关.它不会自动包含继承的接口. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |