2016-05-18 43 views
5

Ho il seguente codice. Voglio sovrascrivere il metodo di notifica dell'elenco base di base su questo per poter creare un evento sulla modifica dell'elenco.Come ereditare il metodo virtuale generico?

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

Se metto Value: T ottengo una "identificatore non dichiarato" su T.

Se è Value: TSomeClass ottengo il "Dichiarazione di 'Notifica' si differenzia dalla precedente dichiarazione" .

Notify è un metodo protetto di TObjectList<T: class>. Questo metodo non appare nell'elenco di override dell'IDE XE2.

Questo è un modo per implementare questo o ho bisogno di utilizzare un altro approccio in quanto questo è un muro di mattoni proverbiale?

risposta

11

Se la classe discendente sta riparando il tipo generico, allora è necessario utilizzare quel tipo fisso al posto del T. Nel tuo caso:

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

è il modo corretto per dichiarare questa funzione.


L'errore:

Dichiarazione di 'Notifica' differisce dalla precedente dichiarazione

è un caso deplorevole dei nomi di tipo duplicatore Delphi RTL in diverse unità.

L'unità System.Classes definisce

TCollectionNotification = (cnAdded, cnExtracting, cnDeleting); 

e System.Generics.Collections definisce

TCollectionNotification = (cnAdded, cnRemoved, cnExtracted); 

Quasi certamente avete Generics.Collections dichiarato primaClasses nella vostra uses clausola e il compilatore sta risolvendo la versione indesiderato di TCollectionNotification.

per risolvere il problema, o riorganizzare il uses clausole in modo che Generics.Collections viene dopo Classeso utilizzare un nome di tipo completo, vale a dire:

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

La lezione con un errore differs from previous declaration è quello di metodicamente controlla i tuoi tipi Ctrl + CLIC sull'identificatore di tipo ti porterà alla definizione del tipo utilizzato dal compilatore.

+1

Perfetto! Ho fatto entrambe le cose: riorganizzato la clausola 'uses' ** AND ** inserire il nome completo. +1 e accettato –