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