免费Pascal多接口问题

时间:2011-08-27 23:56:38

标签: interface casting corba freepascal

这可能很难 - 我在一个对象上使用多个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

2 个答案:

答案 0 :(得分:2)

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

事实证明,FPC内部并未识别CORBA接口。要解决这个问题,需要自己识别它们:

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

然后as关键字将有效。

答案 1 :(得分:1)

不确定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;