Использование вложенного типа, объявленного в универсальном классе в универсальном интерфейсе, который реализует класс

У меня есть общий 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;
Другие вопросы по тегам