Delphi позволяет делегировать интерфейс с помощью ключевого слова implements
.
Например
IIndep1 = interface
function foo2: integer;
end;
IIndep2 = interface
function goo2: integer;
end;
TIndep1And2 = class(TInterfacedObject, IIndep1, IIndep2)
private
FNested : IIndep1; //e.g. passed via constructor or internally created (not shown here)
public
Constructor Create(AIndep1: IIndep1);
function goo2: integer;
property AsIndep1 : IIndep1 read FNested implements IIndep1;
end;
Это хорошо работает, но не для унаследованных интерфейсов. (Сообщение об ошибке «Отсутствует реализация метода интерфейса ILev1.foo»)
ILev1 = interface
function foo: Integer;
end;
ILev2 = interface(ILev1)
function goo: Integer;
end;
TLev2Fails = class(TInterfacedObject, ILev1, ILev2) //Also fails with ILev2 alone (Error: "ILev1 not mentioned in interface list")
private
FNested : ILev1; //passed via constructor or internally created
public
Constructor Create(AILev1: ILev1);
function goo: Integer;
property AsLev1 : ILev1 read FNested implements ILev1;
end;
Обходной путь - добавить дополнительный класс предка
TLev1Wrapper = class(TInterfacedObject, ILev1)
private
FNested : ILev1; //passed via constructor or internally created
public
Constructor Create(AILev1: ILev1);
property AsLev1 : ILev1 read FNested implements ILev1;
end;
TLev2Works = class(TLev1Wrapper, ILev2)
public
function goo: Integer;
end;
Есть ли способ избежать предка класса-оболочки?
[EDIT] Просто примечание о делегировании интерфейса, цель использования implements
состоит в том, чтобы избежать прямого удовлетворения интерфейса, но передать это требование агрегированному или составному члену. Предоставление полного интерфейса и ручное делегирование составному члену сводит на нет преимущества, полученные от использования implements
для управления интерфейсом. На самом деле, в этом случае ключевое слово и свойство implements
могут быть удалены.