1

私は

public class A<T> where T : IBase
{
    //Does something
}

クラス A のコレクションのように動作する 2 番目のクラスが必要です

public class B<A<T>> : IEnumerable<A<T>> where T : IBase
{
}

問題は、次のようなクラスを作成したくないことです

public class B<A<MyCustomObjectP>> : IEnumerable<A<MyCustomObjectP>>
{
}

public class C<A<MyCustomObjectQ>> : IEnumerable<A<MyCustomObjectQ>>
{
}

などなど.. CustomObject を、IBase を実装するジェネリック型パラメーターにしたいと考えています。

これを行うことさえ違法であることがわかりました:

public class B<T, U> : IEnumerable<T> where T : A<U> where U : IBase
{
}

これが違法である場合、どうすればこの種の動作を達成できますか? 役立つようなより良いデザイン パターンはありますか?

4

2 に答える 2

1

IBase制約は で定義されているため、使用A<T>するすべてのジェネリック クラスで再度定義する必要がありますA<U>(クラス定義Uと区別するために使用しTますA<T>が、何でも呼び出すことができます)。簡単にできるはずです:

public class B<T> : IEnumerable<A<T>> where T : IBase { ... }
于 2012-12-13T09:10:25.163 に答える
0

classのコレクションのように動作する 2 番目のクラス が必要だと書きましたA

追加したい他のクラス ( などB) も継承しているため、コレクションを のコレクションにすることができます。IBaseIBase

したがって、ソリューションは次のようになります(私が使用したことに注意してください。ただし、List簡単に置き換えることができますが、自分IEnumerableのようなメソッドを実装する必要があり.Addます):

void Main()
{
    var items = new CollectionOf<IBase>(); // create list of IBase elements
    items.Add(new A() { myProperty = "Hello" }); // create object of A and add it to list
    items.Add(new B() { myProperty = "World" }); // create object of B and add it to list
    foreach(var item in items)
    {
        Console.WriteLine(item.myProperty);
    }
}

// this is the collection class you asked for
public class CollectionOf<U>: List<U>
where U: IBase
{
    // collection class enumerating A
    // note you could have used IEnumerable instead of List
}

public class A: IBase
{
    // class A that implements IBase
    public string myProperty { get; set; }
}

public class B: IBase
{
    // class B that implements IBase too
    public string myProperty { get; set; }
}

public interface IBase {
    // some inteface
    string myProperty { get; set; }
}
于 2012-12-13T09:30:56.893 に答える