Проблема с несколькими интерфейсами Pascal - PullRequest
1 голос
/ 28 августа 2011

Это может оказаться сложным - я использую несколько интерфейсов 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

Ответы [ 2 ]

2 голосов
/ 28 августа 2011

Об этом сообщили как об ошибке в багтрекер FPC - http://bugs.freepascal.org/view.php?id=20076

Оказалось, что FPC не определяет внутренние интерфейсы CORBA. Для решения проблемы необходимо идентифицировать их самостоятельно:

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

Тогда ключевое слово as будет работать.

1 голос
/ 28 августа 2011

Не уверен насчет 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;
...