2016-05-18 20 views
5

Ich habe den folgenden Code. Ich möchte die Notify-Methode der Basisbasisliste auf diese Weise überschreiben, um ein Ereignis bei der Änderung der Liste erstellen zu können.Wie erben generische virtuelle Methode?

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

Wenn ich Value: T setzen erhalte ich eine "nicht deklarierter Bezeichner" auf T.

Wenn Value: TSomeClass ist bekomme ich die "Erklärung von 'Notify' unterscheidet sich von früheren Erklärung" .

Notify ist eine geschützte Methode von TObjectList<T: class>. Diese Methode wird nicht in der übergeordneten Liste der XE2-IDE angezeigt.

Das ist eine Möglichkeit, dies zu implementieren, oder ich muss einen anderen Ansatz verwenden, da dies eine sprichwörtliche Mauer ist?

Antwort

11

Wenn Ihr Nachkomme Klasse der gattungsBefestigungs dann müssen Sie in Ihrem Fall, dass die festen Typ anstelle von T. verwenden:

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

der richtige Weg ist, um diese Funktion zu erklären.


die Fehler:

Erklärung 'Notify' unterscheiden sie von früheren Erklärung

ist ein bedauerlicher Fall der Delphi RTL Dupliziermaschine Typnamen in verschiedenen Einheiten.

Das Gerät System.Classes definiert

TCollectionNotification = (cnAdded, cnExtracting, cnDeleting); 

und System.Generics.Collections

TCollectionNotification = (cnAdded, cnRemoved, cnExtracted); 

Mit ziemlicher Sicherheit haben Sie Generics.Collections erklärt vorClasses in Ihrer uses Klausel und der Compiler wird die Lösung der unerwünschten Version von TCollectionNotification definiert.

es zu beheben, entweder neu organisieren Ihre uses Klauseln, so dass Generics.Collections kommt nach Classesoder einen voll qualifizierten Typnamen verwenden, das heißt:

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

Die Lektion mit einem differs from previous declaration Fehler ist methodisch Überprüfe deine Typen. Ctrl + CLICK über den Typ Bezeichner führt Sie zu der Definition des Typs, den der Compiler verwendet.

+1

Perfekt! Ich habe beide Dinge gemacht: reorganisiert die 'uses'-Klausel ** UND ** setze den voll qualifizierten Namen. +1 und akzeptiert –