Использование вложенного типа, объявленного в универсальном классе в универсальном интерфейсе, который реализует класс
У меня есть общий List-подобный класс tMyList<B>
с методом Each(), который перебирает каждый элемент и вызывает анонимную процедуру tMyList<A>.enumProc
с параметром - текущий элемент типа <B>
, Я хочу реализовать класс в качестве интерфейса для более простого управления временем жизни.
Проблема в том, что я не могу объявить метод Each в iMyList<A>
интерфейс, потому что tMyList<A>.enumProc
тип неизвестен. Насколько я знаю, Интерфейсы не поддерживают вложенные типы?
Вот код:
tMyList<B> = class;
iMyList<A> = interface
procedure each(enumProcedure: iMyList<A>.enumProc); // ERROR - Undeclared identifier: 'enumProc'
end;
tMyList<B> = class(tInterfacedObject, iMyList<B>)
type
enumProc = reference to procedure(item: iMyList<B>);
public
procedure each(enumProcedure: enumProc);
end;
*
Реализация Enumerator в данном конкретном случае не подходит
1 ответ
Решение
Единственный способ выполнить эту работу - это определить процедурный тип вне класса реализации. Как это:
type
IMyIntf<A> = interface;
TMyProc<A> = reference to procedure(Intf: IMyIntf<A>);
IMyIntf<A> = interface
procedure Foo(Proc: TMyProc<A>);
end;
TMyClass<A> = class(TInterfacedObject, IMyIntf<A>)
procedure Foo(Proc: TMyProc<A>);
end;