Free Pascal 多接口问题

Posted

技术标签:

【中文标题】Free Pascal 多接口问题【英文标题】:Free Pascal multiple interfaces problem 【发布时间】:2011-08-27 23:56:38 【问题描述】:

这可能很困难——我在一个对象上使用了多个 CORBA 接口,所以它看起来像这样:

TBaseObject = class(TSuperBaseObject, IInterfaceA)
  function Afunction; // implemented from IInterfaceA
end;

TOtherObject = class(TBaseObject, IInterfaceB);  
  function Bfunction; // implemented from IInterfaceB
end;

现在我有一个接受变体的函数,如果该变体是一个对象,它假定该对象是一个 IInterfaceA 对象:

case var.vtype of
  ...
  vtObject     : begin
    Something := (var.vObject as IInterfaceA).AFunction; (1)
  end;
end;

现在,一旦我运行该代码并将 TOtherObject 传递给函数,在第 (1) 行中,BFunction 会被强制参数调用!

我做错了什么还是编译器中的错误?另外,有什么明智的方法可以在不改变类结构的情况下绕过它?

如果有人想尝试,请提供 EAccessViolation 的完整代码 - http://pastebin.com/D7sDpDHx

【问题讨论】:

【参考方案1】:

将此作为错误报告给 FPC 错误跟踪器 - http://bugs.freepascal.org/view.php?id=20076

事实证明,FPC 在内部无法识别 CORBA 接口。要解决问题,需要自己识别它们:

type IInterfaceA = interface['interface_a']
   function AFunction;
end;

然后as 关键字将起作用。

【讨论】:

【参考方案2】:

不确定FreePascal,但在Delphi中你会使用supports函数来查询接口。

var
    IntfA : IInterfaceA;
    IntfB : IInterfaceB;
 begin 
 case var.vtype of
  ...
  vtObject : begin
             if supports(var.vObject,IInterfaceA,IntfA) then
               Something := IntfA.AFunction
             else if supports(var.vObject,IInterfaceB,IntfB) then
               Something := IntfB.BFunction;
             end;
   end;
end;

【讨论】:

+1:FPC 好像没有supports 关键字,它也使用CORBA 风格的接口,不是COM,但答案让我走上了搜索的正确轨道。

以上是关于Free Pascal 多接口问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Delphi/Free Pascal 中:^ 是运算符还是仅表示指针类型?

易于与 Free Pascal 集成的数据挖掘库?

Free Pascal初次体验(有亮点哦)

为啥 Free Pascal 会自动将记录数据传递给 xmm 寄存器?

free pascal的一个集合(set of)最多可放多少个整数?

Free Pascal IDE 下载安装配置