我有如下情况:
public interface I {}
public class D1 : I {}
public class D2 : I {}
public class A
{
public List<D1> Collection {get;set;}
//Other Members
}
public class B
{
public List<D2> Collection {get;set;}
//Other Members
}
因此,A 和 B 都有包含从 I 派生的元素的列表。
如何为 A 和 B 定义基类?
附言我试图概括基类:
class Base<T> where T : I
{
List<T> Collection {get;set;}
}
A:Base<D1>{..}; B:Base<D2> {..}
但它什么也没给我(或者我只是这么认为): 我不能这样做:
Base<I> b;
b= new A();
b= new B();
因为不可能从List<I>
转换至 List<D1>
谢谢
最佳答案
如果你仔细想想,它确实有道理。
考虑一下:
Base<I> b = new B();
b.List.Add(new D1);
理论上,那将是有效的代码。 Base<I>.List
是 List<I>
. D1
继承自 I
.但是我们知道 List 确实是 List<D2>
(如 B
中所定义)。因此我们对 Add 的调用不可能工作。
如果您实际上不需要将项目添加到集合中,您可以切换一些东西以使其工作:
public interface IBase<out T> where T : I
{
IEnumerable<T> Collection { get; }
}
public class A : IBase<D1>
{
IEnumerable<D1> Collection { get; private set; }
public A(IEnumerable<D1> list)
{
Collection = list;
}
}
public class B : IBase<D2>
{
IEnumerable<D2> Collection { get; private set; }
public B(IEnumerable<D2> list)
{
Collection = list;
}
}
关于c# - 泛型派生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15413964/