Требуется ли для интерфейса делегирования унаследованного интерфейса класс-оболочка?
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
ключевое слово и свойство могут быть удалены.