26

ジェネリック インターフェイスのジェネリック リストを変数として使用する正しい方法を見つけようとしています。

ここに例があります。それはおそらく最高ではありませんが、うまくいけばあなたはポイントを得るでしょう:

public interface IPrimitive<T>
{
     T Value { get; }
}

IPrimitive<T>次に、別のクラスで、任意のオブジェクトのリストを保持する変数を宣言できるようにしたいと考えていますT

// I know this line will not compile because I do not define T   
List<IPrimitive<T>> primitives = new List<IPrimitives<T>>;

primitives.Add(new Star());   // Assuming Star implements IPrimitive<X>
primitives.Add(new Sun());    // Assuming Sun implements IPrimitive<Y>

in は、リスト内のエントリごとに異なる可能性があることTに注意してください。IPrimitive<T>

そのような関係をどのように設定できるかについてのアイデアはありますか? 代替アプローチ?

4

4 に答える 4

29
public interface IPrimitive
{

}

public interface IPrimitive<T> : IPrimitive
{
     T Value { get; }
}

public class Star : IPrimitive<T> //must declare T here
{

}

その後、あなたは持つことができるはずです

List<IPrimitive> primitives = new List<IPrimitive>;

primitives.Add(new Star());   // Assuming Star implements IPrimitive
primitives.Add(new Sun());    // Assuming Sun implements IPrimitive
于 2010-12-23T21:28:58.903 に答える
11

ジョンは正しい。

また、(C#4を使用している場合)インターフェイスを共変にすることをお勧めしますか?

public interface IPrimitive<out T>
{
     T Value { get; }
}

これにより、後でリストから物事を削除する必要があるときに、いくつかの問題を回避できます。

于 2010-12-23T21:29:02.967 に答える
3

を定義していないため、機能しないと言いますT。したがって、次のように定義します。

public class Holder<T>
{
    public List<IPrimitive<T>> Primitives {get;set;}
}
于 2010-12-23T21:27:14.517 に答える