2009-05-22 6 views
5

はのは、C#で、このクラスを想定してみましょう:のC#:リストで継承問題<T>

public class LimitedList<T> : List<T> 
{ 
    private int _maxitems = 500; 

    public void Add(T value) /* Adding a new Value to the buffer */ 
    { 
     base.Add(value); 
     TrimData(); /* Delete old data if lenght too long */ 
    } 

    private void TrimData() 
    { 
     int num = Math.Max(0, base.Count - _maxitems); 
     base.RemoveRange(0, num); 
    } 
} 

コンパイラは私にライン "公共ボイドは追加(T値)" で、この警告を与える:

警告CS0108: 'System.LimitedList.Add(T)'は継承メンバ 'System.Collections.Generic.List.Add(T)'を非表示にします。隠れが意図されていた場合は、新しいキーワードを使用してください。

この警告を回避するにはどうすればよいですか?あなたが宣言に「新」を追加することによって、この警告を回避することができ、あなたの助け

+1

継承を使用する場合でも、インターフェイスの残りの動作をオーバーライドすることを忘れないでください。それ以外の場合は、コレクションではなく、コレクションを持つ必要があります。 –

答えて

12

ません - はここではない使用newを行います。それはあなたに多形性を与えません。 List<T>は、このように継承を意図していません。 Collection<T>overrideAddInsertItemの方法を使用してください。

public class LimitedCollection<T> : Collection<T> 
{ 
    private int _maxitems = 500; 

    protected override void InsertItem(int index, T item) 
    { 
     base.InsertItem(index, item); 
     TrimData(); /* Delete old data if lenght too long */ 
    } 

    private void TrimData() 
    { 
     int num = Math.Max(0, base.Count - _maxitems); 
     while (num > 0) 
     { 
      base.RemoveAt(0); 
      num--; 
     } 
    } 
} 
+0

これは、これを適切にコード化する方法に関するより良い説明です。ありがとうMarc – CodeLikeBeaker

+0

私は全体のインターフェイスを実装する必要がありますか? –

+0

いいえ - 更新を参照してください –

11

Thxを。

public new void Add(T value) { 
... 
} 

しかし、私はあなたがこの問題に少しでも間違いがあるかもしれないと思います。私の見解では、LimitedListはリスト内のデータ量に厳しい制約を課すため、非常に異なる動作を表現するため、Listではありません。 Listから継承するのではなく、Listをメンバー変数として持つ方がずっと良いと思います。

これが悪い理由のもう一つの理由は、クラスの契約をリストと見なしてもそれを満たすことができないということです。次のコードでは、ListのAddメソッドを使用し、LimitedListは使用しません。

List<int> list = new LimitedList<int>(10); 
for (i = 0; i < 10000; i++) { 
    list.Add(i); 
} 
+0

+1 ... 14秒 –

+1

IMO間違っています。多形性を提供しません。 –

+0

これは、新しいものを無効にすることは正しくありません。 –

1

「追加」メソッドを「新しい」(置換)メソッドとして宣言する必要があります。 これを試してみてください:

public class LimitedList<T> : List<T> 
{ 
    private int _maxitems = 500; 

    public new void Add(T value) /* Adding a new Value to the buffer */ 
    { 
     base.Add(value); 
     TrimData(); /* Delete old data if length too long */ 
    } 

    private void TrimData() 
    { 
     int num = Math.Max(0, base.Count - _maxitems); 
     base.RemoveRange(0, num); 
    } 
} 

予告「追加(...」宣言で「新しい」キーワードを

をこの例では、あなたがIListインターフェイスを実装し、独自のジェネリッククラスを作成する必要があり、けれども。 。 希望に役立ちます。他の人と同様に

+0

これは良い考えではない理由を確認するために多形性についての他の返信を参照してください。 –

0

が述べた、新しいキーワードを追加する必要があります。基本クラス(リスト<T>)でAddメソッドがでマークされていないので、この理由は、キーワード「バーチャル基本的には「上書き可能」を意味します。したがって、それは "新しい"としてマークする必要があります。