1

我有一个

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

我需要第二个类,其行为类似于 A 类的集合

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用于区别于TA<T>定义,但它可以被称为任何东西)。你应该能够简单地做:

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

您写道,您需要第二个类,其行为类似于class 的集合A

由于您还有其他要添加的类(如B)继承自IBase,因此您可以将集合设为IBase.

因此,解决方案看起来像这样(请注意,我已经使用过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 回答