自由Pascal多接口问题



这可能很困难——我在一个对象上使用了多个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)行b函数调用强制参数!

是我做错了什么,还是它是一个错误的编译器?另外,有没有什么方法可以在不改变类结构的情况下规避这个问题?

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

将此作为bug报告给FPC bugtracker - http://bugs.freepascal.org/view.php?id=20076

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

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

那么as关键字将工作

对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;

最新更新