2009-02-27 11 views
0

カスタムコレクションを持つC#でプログラムを作成しています。カスタムコレクションは、ResultInfo型のメンバー上でいくつかの便利な集計関数(AllSuccessful、%Successfulなど)を実行します。私はResultInfo(UploadResultInfo、XUploadResultInfo、およびYUploadResultInfo)から派生し、追加の集約関数を持つResultInfoCollectionを継承する追加のコレクションを持つことを望むいくつかのクラスを持っています。指定された通りにこれを行うことによる唯一の問題は、それが無用のままになることである。コレクション上では、役に立たないままになることが唯一の問題である。 説明:このメソッドはResultInfo型の引数をとりますが、UploadResultInfoCollectionにResultInfoを追加するとエラーが発生します。私の問題を解決するうまい方法がありますか?私はジェネリックスを考えましたが、どのように動作するのかはよくわかりません。継承されたコレクションを設計する方法

+0

コレクションにアイテムを追加するためにメソッドが使用されないのはなぜですか?他にどのようにアイテムを入れますか? –

+0

ResultInfoは抽象基本クラスですか? – foson

答えて

2

後で、ちょうどそれらを使用してみてください

MyCollection<FooResultInfo> coll = new MyCollection<FooResultInfo>(); 

でそれを使用することができますに、彼らはあまりにもでないあなただけの

public class MyCollection<T> : ICollection<T> 
where T : ResultInfo 
{ 

    ... the required methods ... just use "T" instead of "ResultInfo" ... 

    public void Add(T item) {} 
} 

のようにそれを定義ResultInfoの子を扱う一般的なクラスを定義します難しく学習することが最良の方法です...

+0

私はこのアイデアを試してみる必要がありますが、それはよさそうです。 –

0

役に立たないAddメソッドをどのように残しているか分かりません。

コレクションに自身が移入する場合は、Addメソッドをprivateにできます。

継承された追加コレクションでAddメソッドが公開されないようにするには、継承の代わりにcompositionを使用します。

+0

一般にaddメソッドは役に立たないわけではありません。しかし、私は彼らがUploadResultInfoCollectionにResultInfoを追加したくないので、多くの場合、public void Add(ResultInfo ri)がエラーをスローします。 –

0

あなたの役に立つメソッドが実際にインスタンスメソッドである必要があるかどうかを検討してください。

他の操作が発生したとき、または公開されている(または内部で利用可能な)APIを使用してすべての状態を維持できる必要がありますか?

もしそうなら、単純にそれらを静的メソッドにしてください(拡張メソッドはおそらく良いアイデアです)、継承については心配しないでください。メソッドがIEnumerable <T>で有意義であれば、このようにすれば、ユーティリティ関数を非常に使いやすく、有用なものにすることができます。

結果の関数パッケージを使用するには、関連する名前空間をインポートするだけで済みます。

0

既存のコレクションタイプに追加のメソッドを追加するだけの場合は、そのタイプの拡張メソッドを定義し、通常のジェネリックコレクションを使用するだけで構いません。

関連する問題