c# - 泛型派生

标签 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 都有包含从 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>.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;
    }
}

关于c# - 泛型派生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15413964/

相关文章:

javascript - 如何在 javascript 中传递方法?

c# - 状态设计模式的功能等价物

c# - 带枚举的 MVC3 RadioButtonFor

c# - 带有 Ninject 的 WPF 应用程序

c# - 从 DataGrid WPF C# 中的选定行获取特定单元格的数据

c# - 图表,显示列表中的数据

c# - Vector3.MoveTowards 没有做它的事情

oop - 如何让 MATLAB 识别新添加的静态方法?

c# - 运算符和继承

python - @staticmethod 和@classmethod 的区别