2016-05-18 7 views
5

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

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

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

Если это Value: TSomeClass я получаю "Декларация 'Notify' отличается от предыдущей декларации" ,

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

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

ответ

11

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

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

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


Ошибка:

Декларация 'Notify' отличается от предыдущей декларации

является прискорбным случаем имен типа тиражирования 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 на идентификаторе типа приведет вас к определению типа, используемого компилятором.

+1

Отлично! Я сделал две вещи: реорганизовал предложение 'uses' ** AND ** поставить полное имя. +1 и принято –

Смежные вопросы