什么时候使用泛型和继承?

问题描述 投票:8回答:7

使用泛型而非继承,情况如何及其相关的好处,反之亦然,如何最好地将它们组合在一起?

感谢您的回答。

我将尽力说明这个问题的动机:我有一个如下所示的课程:

class InformationReturn<T> where T : Info
{
    InformationReturn(Employee employee, List<T>) { ... }
}

现在,假设我有一个采用InformationReturn参数的存储库,该存储库必须根据Info对象T的类型在数据库中插入不同的字段。最好为类型T创建不同的存储库吗?一个使用反射确定类型的存储库;还是有更好的方法在/泛型上使用继承功能?

注意:其他客户端代码也必须根据T的类型进行不同的操作。

c# .net vb.net generics inheritance
7个回答
6
投票

它们完全是完全不同的想法。泛型使您可以以通用方式声明常见的“特定”功能(可能会听起来有些矛盾)。除了保存在内部的数据类型之外,List<int>的功能与List<string>相同。

虽然继承可以用来做同样的事情,但我可以创建一个List类,然后创建一个从其继承的IntListStringList类。我可以轻松地使这两个类的功能完全不同,或者使一个类提供另一种不提供的功能。

编辑

查看问题的编辑后,答案的排序为“取决于。”您可以为双方都做参数-实际上,LINQ to SQL和Entity Framework都是使用泛型的反射检查和强类型实体类以及其他存储库类的组合。您当然可以采用您正在研究的方法,只是知道,通常,可以通过反射或其他方法解决的问题很可能在通过“其他方法”解决时会更快。它取决于您在性能,可维护性,可读性和可靠性之间要进行多少权衡。


12
投票

泛型和继承是两个独立的事物。继承是OOP的概念,泛型是CLR的功能,允许您在编译时为公开它们的类型指定类型参数。


10
投票

使用泛型来指定可以用某种“未知类型”表示的算法或类型的行为,同时保留根据该未知类型强类型化的API。未知类型称为type parameter


10
投票

如果只希望将相同的功能应用于各种类型(添加,删除,计数),则将使用泛型,并且将实现方式不同


5
投票
当您要创建可应用于多种样式的未知类的“模板”时,请使用泛型。例如。收藏藏品???是仿制药的良好候选者。当您有一个基本概念认为子代“是”该概念的扩展时,就继承。

3
投票
继承更多的是关于“ is-a”(青蛙是一种动物),其中泛型是关于创建对类型化数据(T的列表,T的处理器等)起作用的容器。它们是

非互斥


0
投票
继承和参数化类型都不能在运行时更改
© www.soinside.com 2019 - 2024. All rights reserved.