2016-05-18 11 views
5

私は次のコードを持っています。私は、リストの変更時にイベントを作成できるように、このベースベースリストのNotifyメソッドをオーバーライドする必要があります。汎用仮想メソッドを継承する方法は?

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

私はValue: Tを置けば、私は " '通知' の宣言が前の宣言とは異なり、" を取得Value: TSomeClassであれば、私はT.

"未定義の識別子"を取得。

NotifyTObjectList<T: class>の保護された方法です。このメソッドは、XE2 IDEのオーバーライドリストには表示されません。

これはこれを実装するための方法ですが、これは別のアプローチを使用する必要があります。

答えて

11

あなたの子孫クラスを使用すると、あなたのケースでは、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); 

を定義してほぼ確実にあなたはTCollectionNotificationの望ましくないバージョンを解決されてあなたのuses句とコンパイラにClassesGenerics.Collections宣言しました。

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

differs from previous declarationエラーとのレッスンは念入りにある:Classesまたはは、完全修飾型名を使用した後Generics.Collectionsはすなわち、来るようにどちらか、それを修正あなたのuses句を再編成する

あなたのタイプをチェックしてください。 Ctrl + タイプ識別子のCLICKは、コンパイラが使用しているタイプの定義に移動します。

+1

パーフェクト!私は両方のことを行いました: 'uses'節を再編成してください**そして**完全修飾名を入れてください。 +1して受け入れる –