泛型衍生

时间:2013-03-14 15:51:31

标签: c# oop

我的情况如下:

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都有List,其元素来自I.

如何为A和B定义基类?

P.S。我试图概括基类:

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>

由于

1 个答案:

答案 0 :(得分:2)

如果你考虑一下,它确实有意义。

考虑一下:

Base<I> b = new B();
b.List.Add(new D1);

理论上,这将是有效的代码。 Base<I>.ListList<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;
    }
}