2011-08-27 103 views
1

这可能证明是困难的 - 我使用一个对象在多个CORBA接口,所以它看起来在某种程度上是这样的:的Free Pascal多个接口问题

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

不确定FreePascal的,但在Delphi中你可以使用支持函数来查询的接口。

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

+1:FPC似乎没有支持关键字,它也使用CORBA风格的接口,而不是COM,但答案让我在搜索的正确轨道上。 –

2

报告此作为对FPC的错误追踪系统中的错误 - http://bugs.freepascal.org/view.php?id=20076

原来,FPC不能识别内部CORBA接口。为了解决一个需要由自己来识别它们的问题:

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

然后as关键字会工作。