Как наследовать общий виртуальный метод?
У меня есть следующий код. Я хочу переопределить метод 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 на идентификаторе типа приведет вас к определению типа, который использует компилятор.