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