Форвардная декларация с дженериками

Итак, как сделать правильную предварительную декларацию с помощью дженериков?

type
  TGenericCollectionItem = class;

  TGenericCollection<T: TGenericCollectionItem> = class(TObjectList<T>) // line 14
  protected
    procedure Notify(const Value: T; Action: TCollectionNotification); override;
  end;

  TGenericCollectionItem = class
  public
    Owner: TGenericCollection<TGenericCollectionItem>;
  end;

[Ошибка dcc32] Project1.dpr(14): E2086 Тип «TGenericCollectionItem» еще не полностью определен


person kot-da-vinci    schedule 25.08.2014    source источник
comment
FWIW, в дженериках не обычно, чтобы классы были настолько зависимы, т. е. чтобы CollectionItem знал о своей коллекции. Обобщения были разработаны, чтобы сделать такие зависимости ненужными. Коллекция не должна знать об элементах (за исключением того, что указано в ограничениях), а элемент абсолютно ничего не знает о коллекции.   -  person Rudy Velthuis    schedule 25.08.2014
comment
@Rudy В этом нет смысла. Необходимость, чтобы элементы знали о своих контейнерах, совершенно не зависит от дженериков. Переходя от контейнеров, не все виды использования дженериков являются контейнерами. Неспособность языка поддерживать предварительные объявления с дженериками является сокрушительным ограничением. Дизайнеры ошиблись в дизайне. Это отстой.   -  person David Heffernan    schedule 25.08.2014