使用泛型而非继承,情况如何及其相关的好处,反之亦然,如何最好地将它们组合在一起?
感谢您的回答。
我将尽力说明这个问题的动机:我有一个如下所示的课程:
class InformationReturn<T> where T : Info
{
InformationReturn(Employee employee, List<T>) { ... }
}
现在,假设我有一个采用InformationReturn参数的存储库,该存储库必须根据Info对象T的类型在数据库中插入不同的字段。最好为类型T创建不同的存储库吗?一个使用反射确定类型的存储库;还是有更好的方法在/泛型上使用继承功能?
注意:其他客户端代码也必须根据T的类型进行不同的操作。
它们完全是完全不同的想法。泛型使您可以以通用方式声明常见的“特定”功能(可能会听起来有些矛盾)。除了保存在内部的数据类型之外,List<int>
的功能与List<string>
相同。
虽然继承可以用来做同样的事情,但我可以创建一个List
类,然后创建一个从其继承的IntList
和StringList
类。我可以轻松地使这两个类的功能完全不同,或者使一个类提供另一种不提供的功能。
编辑
查看问题的编辑后,答案的排序为“取决于。”您可以为双方都做参数-实际上,LINQ to SQL和Entity Framework都是使用泛型的反射检查和强类型实体类以及其他存储库类的组合。您当然可以采用您正在研究的方法,只是知道,通常,可以通过反射或其他方法解决的问题很可能在通过“其他方法”解决时会更快。它取决于您在性能,可维护性,可读性和可靠性之间要进行多少权衡。
泛型和继承是两个独立的事物。继承是OOP的概念,泛型是CLR的功能,允许您在编译时为公开它们的类型指定类型参数。
使用泛型来指定可以用某种“未知类型”表示的算法或类型的行为,同时保留根据该未知类型强类型化的API。未知类型称为type parameter
如果只希望将相同的功能应用于各种类型(添加,删除,计数),则将使用泛型,并且将实现方式不同
非互斥