Как наследовать общий виртуальный метод?

У меня есть следующий код. Я хочу переопределить метод Notify базового базового списка для этого, чтобы иметь возможность создать событие при модификации списка.

  TDescendantList = class(TObjectList<TSomeclass>)
  private
    <...>
  protected
    procedure Notify(const Value: T;
      Action: TCollectionNotification); override;
    <...>
  end;

Если я поставлю Value: T Я получаю "Необъявленный идентификатор" на T.

Если есть Value: TSomeClass Я получаю "Декларация" Уведомить "отличается от предыдущей декларации".

Notify это защищенный метод TObjectList<T: class>, Этот метод не отображается в переопределяющем списке IDE XE2.

Это какой-то способ реализовать это, или мне нужно использовать другой подход, так как это общеизвестная кирпичная стена?

1 ответ

Решение

Если ваш класс-потомок фиксирует универсальный тип, тогда вы должны использовать этот фиксированный тип вместо T. В вашем случае:

protected
  procedure Notify(const Value: TSomeclass;
                   Action: TCollectionNotification); override;

правильный способ объявить эту функцию.


Ошибка:

Декларация "Уведомить" отличается от предыдущей декларации

достойный сожаления случай дублирования имен типов Delphi RTL в разных единицах.

Единица System.Classes определяет

TCollectionNotification = (cnAdded, cnExtracting, cnDeleting);

а также System.Generics.Collections определяет

TCollectionNotification = (cnAdded, cnRemoved, cnExtracted);

Почти наверняка у вас есть Generics.Collections объявлено ранее Classes в вашем uses предложение и компилятор разрешает нежелательную версию TCollectionNotification,

Чтобы это исправить, либо реорганизуйте свой uses пункты так, чтобы Generics.Collections идет после Classes или используйте полное имя типа, то есть:

  procedure Notify(const Value: TSomeClass;
    Action: Generics.Collections.TCollectionNotification); override;

Урок с differs from previous declaration ошибка заключается в методической проверке ваших типов. Ctrl+CLICK на идентификаторе типа приведет вас к определению типа, который использует компилятор.

Другие вопросы по тегам