2011-08-27 31 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關鍵字會工作。