2012-02-20 8 views
3

が共通の問題の簡単な例です:いくつかの点でジェネリック型定義を非ジェネリック型から派生させることが重要だと思いますか?ここで

ICollection<int> myIntegers = .... 
    ICollection<string> myStrings = .... 

、私は彼らがIEnumerableをとして型指定された受信方法に、これらおよび他 型のインスタンスを渡します。 (非一般形式)。

反射を経由して、バックドアを通ってハッキングすることなく、 そのコードは判断できません。

1. That the instance is a constructed type of ICollection<T> 

    2. The number of elements in the ICollection<T>-based type. 

ジェネリック引数が何であるかを知りません。

私は(ICollectionをのCountプロパティのように、例えば)ジェネリック引数の型 には依存性がない操作を 提供ジェネリック型を定義するとき、私は 私は一般的に非ジェネリック基本型を定義し、それが です私はそうのような、非タイプ依存の操作を置く場所:ことを考えると

public abstract class FrugalList 
{ 
    public abstract int Count {get;} 
} 

public class FrugalList<T> : FrugalList 
{ 
    public override int Count {get{...}} 
    void Add(T item) {...} 
} 

、私は 、ジェネリック型定義の上に構築され、あらゆるタイプ のインスタンスのカウントを取得するには、抽象基本型 を使用することができます簡単に。

質問は非常に簡単です。 この機能を提供することが重要です(インターフェイス経由でも可能です)。

答えて

0

私の意見では、あなたが呼び出す方法の問題です。

このメソッドがIEnumerableを要求する場合、呼び出し側はそのインターフェイスで提供されているものを超える必要はないことを呼び出し側に宣言します。 メソッドがCountを知る必要がある場合は、例えば、適切なインタフェースを要求するだけで、汎用的になり、タイプICollection<T>のパラメータで宣言する必要があります。

つまり、ジョブを実行する既存の標準インタフェースがある場合は、「新しい」コレクション型を作成する必要はありません。

+0

申し訳ありません。 Enumerable.Count()の実装を見れば、その理由を理解できます。要するに、私のコードはIEnumerableを受け入れますが、渡されたオブジェクトがコレクションである場合、私のコードはシーケンス内の項目の数を事前に取得する能力に基づいて最適化することができます。 - Tony Tanzillo 2分前 –

関連する問題