Интерфейсы в Lazarus / FPC: множественное наследование - PullRequest
4 голосов
/ 02 апреля 2012

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

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

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

type
  IInfoTips = interface(IPersistFile, IQueryInfo)

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

Ответы [ 2 ]

0 голосов
/ 18 апреля 2016

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

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

type
  TMyInfoTips = class(TInterfacedObject, IPersistFile, IQueryInfo)

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

type
  IInfoTips = interface(IPersistFile, IQueryInfo)

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

Delphi также не поддерживает его.Только несуществующий Delphi для компилятора .Net сделал ... но потому что .Net / C # IR поддерживает (и ожидает) эту функцию.

Я также пропускаю эту функцию в Delphi или FPC.

0 голосов
/ 07 апреля 2012

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

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

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

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

uses activex;

var x :IPersistfile;
    y :IPersistStream;
begin
  x.queryinterface(IID_IPersistStream,y);
end.
...