我有一个
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
{
}
如果这是非法的,我怎么能实现这种行为呢?是否有更好的设计模式可能会有所帮助?
答案 0 :(得分:1)
IBase
约束是在A<T>
上定义的,因此必须在所有要使用A<U>
的通用类上再次定义(使用U
来区分T
在A<T>
类定义中{1}},但它可以被称为任何东西)。你应该可以做到:
public class B<T> : IEnumerable<A<T>> where T : IBase { ... }
答案 1 :(得分:0)
您写道,您需要第二类,其行为类似于类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; }
}