Интерфейсы в Lazarus/FPC: множественное наследование

Я пытаюсь создать расширение оболочки для предоставления информации EXIF ​​для файлов JPEG в «информационных подсказках» проводника Windows и использую Lazarus, поскольку для этого необходимо создать x64 DLL.

Поддерживает ли Lazarus множественное наследование с интерфейсами, и если да, то как мне это сделать?

например, что-то вроде:

type
  IInfoTips = interface(IPersistFile, IQueryInfo)

Спасибо, Марк


person Mark K Cowan    schedule 02.04.2012    source источник


Ответы (2)


Нет, интерфейсы в FPC еще не поддерживают множественное наследование.

Что вы можете сделать, так это позволить классу реализации наследовать оба интерфейса:

type
  TMyInfoTips = class(TInterfacedObject, IPersistFile, IQueryInfo)

Но не на уровне интерфейса, как вы хотите. Такие операторы не будут компилироваться:

type
  IInfoTips = interface(IPersistFile, IQueryInfo)

Вы можете «наследовать» только от одного типа интерфейса.

Делфи тоже не поддерживает. Это сделал только несуществующий компилятор Delphi для .Net... но поскольку .Net/C# IR поддерживает ( и ожидает) особенность.

Мне также не хватает этой функции в Delphi или FPC.

person Arnaud Bouchez    schedule 18.04.2016

Оба интерфейса определены в shlobj для Free Pascal/Lazarus, как и в Delphi. Если символы изменялись в единицах измерения во время существования Delphi, мы пытаемся поместить их в более поздние единицы, но в этом случае возникает большое отставание.

Все это должно быть в значительной степени совместимо с Delphi, возможно, будет проще, если вы объясните, что именно не работает так, как ожидалось.

Добавлено после комментариев Арно:

Нет. Объекты реализуют интерфейсы в Паскале. Я вообще не понимаю, почему это действительно важно делать. Конечно, это немного синтаксический сахар, но поскольку любой интерфейс в стиле Delphi реализует Iunknown, вы можете просто запросить интерфейс для другого интерфейса:

uses activex;

var x :IPersistfile;
    y :IPersistStream;
begin
  x.queryinterface(IID_IPersistStream,y);
end.
person Marco van de Voort    schedule 07.04.2012
comment
ИМХО вы не ответили на вопрос. Вопрос заключался в том, поддерживает ли FPC множественное наследование в интерфейсах. Неуправляемого Delphi нет даже в последних версиях. Только Delphi для .Net. Есть ли ФПК? Я думаю, ни... - person Arnaud Bouchez; 15.04.2016
comment
Это было слишком давно, поэтому я не знаю, почему ответ и вопрос не совпадают. Тем не менее, я рассмотрел вопрос и ответил на него. - person Marco van de Voort; 16.04.2016
comment
Боюсь, вы так и не ответили на вопрос. Речь шла не о реализации интерфейса, а о самом определении интерфейса. Вопрос заключался в том, может ли интерфейс иметь множественное наследование, как это возможно в C# или Java AFAIR. Такое множественное наследование интерфейсов может иметь свои преимущества. Я пришел к этому старому вопросу, потому что он мне был нужен, узнал, что Delphi не разрешает этого, и хотел быть уверенным, что я ничего не пропустил, и что множественное наследование действительно не было реализовано Delphi (но Delphi для .Net) . Эта приятная функция все еще находится в цикле контроля качества... И не реализована в FPC... - person Arnaud Bouchez; 18.04.2016
comment
И первое слово моего второго ответа НЕТ. А в остальном я не вижу пользы и обходного пути. - person Marco van de Voort; 18.04.2016