2016-05-18 18 views
5

Mam następujący kod. Chcę nadpisać metodę Notify bazowej listy podstawowej, aby móc utworzyć zdarzenie na modyfikacji listy.Jak odziedziczyć ogólną metodę wirtualną?

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

Jeśli kładę Value: T dostaję "identyfikator" nierejestrowana na T.

Jeśli jest Value: TSomeClass otrzymuję "Deklaracja 'Informuj' różni się od poprzedniej deklaracji" .

Notify jest chronioną metodą TObjectList<T: class>. Ta metoda nie pojawia się na nadpisującej liście IDE XE2.

To jakiś sposób realizacji tego lub muszę użyć innego podejścia, ponieważ jest to przysłowiowy mur z cegły?

Odpowiedz

11

Jeśli klasa potomek jest ustalenie typu rodzajowego następnie trzeba użyć tej stałej typu zamiast T. W twoim przypadku:

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

jest poprawny sposób zadeklarować tę funkcję.


Błąd:

Deklaracja 'Informuj' różni się od poprzedniej deklaracji

jest godne ubolewania przypadek nazwami typu powielanie Delphi RTL w różnych jednostkach.

Jednostka System.Classes definiuje

TCollectionNotification = (cnAdded, cnExtracting, cnDeleting); 

i System.Generics.Collections definiuje

TCollectionNotification = (cnAdded, cnRemoved, cnExtracted); 

Prawie na pewno masz Generics.Collections oświadczył przedClasses w klauzuli uses i kompilator rozwiązywania niepożądanemu wersję TCollectionNotification.

Aby go naprawić, albo reorganizacji klauzule uses tak że Generics.Collections przychodzi po Classeslub użyć pełnej nazwy typu, a mianowicie:

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

Lekcja z błędem differs from previous declaration jest metodycznie sprawdź swoje typy. Ctrl + KLIKNIJ na identyfikatorze typu przeniesie Cię do definicji typu, którego używa kompilator.

+1

Idealnie! Zrobiłem obie rzeczy: zreorganizowałem klauzulę 'uses' ** ORAZ ** wpisz pełną nazwę. +1 i akceptowane –

Powiązane problemy