首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C#泛型和多态:一个矛盾?

在C#编程语言中,泛型和多态是两个非常重要的概念,它们在编程中具有广泛的应用。然而,它们之间也存在一些矛盾和限制。

泛型是指在编程时,不针对特定的数据类型进行编写代码,而是针对一般性的数据类型进行编写代码。泛型的主要优势在于提高代码的可重用性和类型安全性。泛型在C#中主要通过泛型类和泛型方法来实现。

多态是指在编程时,允许子类继承父类的属性和方法,并且允许子类重写父类的方法。多态的主要优势在于提高代码的可扩展性和灵活性。多态在C#中主要通过接口、抽象类和虚方法来实现。

然而,泛型和多态之间存在一些矛盾和限制。例如,泛型类和泛型方法不能是虚方法,因为虚方法需要在运行时动态绑定,而泛型类和泛型方法需要在编译时进行类型检查和代码生成。因此,如果需要在泛型类或泛型方法中使用多态,则需要使用接口或抽象类来实现多态。

此外,泛型和多态也存在一些限制。例如,泛型类和泛型方法不能是密封类或密封方法,因为密封类和密封方法不能被继承或重写。因此,如果需要在泛型类或泛型方法中使用密封类或密封方法,则需要避免使用泛型。

总之,泛型和多态是C#编程中非常重要的概念,它们可以帮助开发人员编写更加可重用、可扩展和类型安全的代码。然而,在使用泛型和多态时,也需要注意它们之间的矛盾和限制,以避免出现编译错误或运行时错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C#入门类、集合、方法、约束、委托

.NET/C#面试手册:基础语法 .NET/C#面试手册:面向对象 .NET/C#面试手册:集合、异常、、LINQ、委托、EF!...不然 集合ArrayList的装箱拆箱 常见的类型 方法 约束 委托 ###很难理解?...关于入门的文章csdn博客园有很多,这里我也写一篇关于我对学习的一个总结,如果出现错误表达不当的地方,还希望评论指出。...2.创建类,可在编译时创建类型安全的集合 3.避免装箱拆箱操作降低性能,在大型集合中装箱拆箱的影响非常大....,声明的时候还是类、方法一样加个 站个坑,其实委托使用的时候不是很多,要慎用。

2.5K30

C#

(Generic) 是C# 2.0中的新增元素。这种机制允许将类名作为参数传递给类型,并生成相应的对象。...将(包括类、接口、方法等)看作模板可能更好理解,模板中的变体部分将被作为参数传进来的类名称所代替,从而得到一个新的类型定义。   通过可以定义类型安全类,而不会损害类型安全、性能或工作效率。...List list = new List(); //定义并初始化一个list的范集合。   有助于您最大限度地重用代码、保护类型的安全以及提高性能。   ...在使用以前,我们要在程序的开头引入using System.Collections.Generic空间。 而在C#中Generic为我们提供的类型有List、Directory等。...提供用于对列表进行搜索、排序操作的方法。T为类型参数,代表列表中元素的类型。该类实现了IList接口,是ArrayList类的等效类,其大小可按需动态增加。

1.7K40
  • c#

    一、的引入 1.:宽泛的——不确定的; :类型——不确定的类型 2.调用普通方法的时候,参数类型在声明时就确定了,调用按照类型传递参数即可 3.如果可以通过参数推导出来则可以省略尖括号...为什么不能使用object的替代 a.性能问题——装箱拆箱 b.类型安全问题 二、的声明——设计思想 1.方法:在一个方法名称后面多了一个尖括号,尖括号中有占位符 2.延迟声明...四、的应用 1.方法——可以一个方法满足不同的类型需求 2.类——可以一个类满足不同类型的需求 3.接口——可以一个接口满足不同类型的需求 4.委托——可以一个委托满足不同类型的需求...Console.WriteLine(GenericCache.GetCache()); Console.WriteLine(GenericCache.GetCache()); 七、的协变逆变...协变逆变只支持接口委托 协变可以让右边使用子类,左边使用父类。

    9010

    C#

    (Generic),是将不确定的类型预先定义下来的一种C#高级语法,我们在使用一个类,接口或者方法前,不知道用户将来传什么类型,或者我们写的类,接口或方法相同的代码可以服务不同的类型,就可以定义为...自定义: 学会自定义,那么遇到微软为我们预先定义好的数据结构也会很容易理解。...>,只要符合C#命名规范即可,但我们一般用只T,定义以后,在其代码块中的任何位置即可引用这一类T,我们在用的时候传入的类型,会替代所有的T,所以不要认为是弱类型,它是强类型的。...,在中,由于T可能是值类型也可能是引用类型,我们编码时无法确定,所以我们无法通过正常形式,将T赋给一个既定的类型,所以有如下语法: defalut(T);//根据类型被赋值类型,引用类型则返回null...第一行,指定T,必须继承SuperGeneric类,而且必须有一个公共无参的构造方法 第二行,分别用where 指定了T1,T2的约束,对于多个类型,添加约束就要这样写,一个where对应一个类型

    50410

    C#

    1、的优势 在日常开发中,我们经常会开发一些特殊的功能,而这个功能适用于多个类型(比如string,int等多种类型),最简单的做法是给每种类型都做一个实现,这种做法的缺点是代码冗余,无疑增加了我们的工作量...最好的方法是使用,.NET自从2.0开始支持,它不仅是编程语言的一部分,而且与程序集中间语言IL紧密结合。...以下是的优点 (1)、通过我们不必给不同的类型编写功能相同的许多方法或类,只创建一个方法或类即可。...(2)、通过,我们可以创建独立于被包含的类型的类方法 (3)、类的类型可以根据需要进行替换,保证了类型的安全性。注:如何传入的类型不支持类,那么编译器就会报错。  ...这个后面会提到约束的问题! (4)、不仅限于类,而且适用于接口方法 (5)、

    657100

    C#详解

    使用 下面是用来重写上面的栈,用一个通用的数据类型T来作为一个占位符,等待在实例化时用一个实际的类型来代替。...类实例化的理论 C#类在编译时,先生成中间代码IL,通用类型T只是一个占位符。...由以上示例可知,C#是在实例的方法被调用时检查重载是否产生混淆,而不是在类本身编译时检查。同时还得出一个重要原则: 当一般方法与方法具有相同的签名时,会覆盖方法。...的使用范围 本文主要是在类中讲述,实际上,还可以用在类方法、接口、结构(struct)、委托等上面使用,使用方法大致相同,就不再讲述。 小结 C# 是开发工具库中的一个无价之宝。...尽管 C# 的根基是 C++ 模板,但 C# 通过提供编译时安全支持将提高到了一个新水平。C# 利用了两阶段编译、元数据以及诸如约束一般方法之类的创新性的概念。

    1.2K60

    C#动态调用类、方法

    在制作一个批量序列化工具时遇到了如下问题,在此记录一下,仅供参考。       主程序加载另一个程序集,将其中的所有类取出,然后对这些类分别调用类或方法。...控制台程序解决方案如下: Main工程:提供Worker类进行数据操作,XMLTool类将数据集序列化为.xml文档,RootCollection类封装数据集 Worker类       ...下面通过反射方式来获取方法,并创建特定类型的方法。...对于非静态方法:public void DoWork()           对于非静态方法,调用MethodInfo.Invoke(object, object[])时,第一个参数需要指明方法的所有者...首先应通过反射构造出指定类型的类XMLTool,再反射出其中的XmlSerialize_Save方法并使用。

    2.9K20

    接口,通配符

    接口接口的定义,public interface man{...}。在接口名后面加上类型参数T,这样就定义了一个接口。 ?...类的定义,public class Man{...},在类名后面加上类型参数T,这样就定义了一个类。 ? 接口不同,类有构造器,并且构造器也可以使用类型参数。...如果java里面没有继承这个特性,那么到这里就讲完了,但是,正因为java有继承这个特性,会导致很多其他的问题出现,其复杂程度会几何级的上升,后面的知识点对抽象能力思维能力有较高的要求,请做好战斗准备...2.再看另一个问题,如果父类是类型,如何定义子类? ? 类的子类 如果将一个类定义为类,那么在创建该类的子类的时候不能将子类直接继承该类,而是需要指定父类的类型。...在java中,不能继承实现。为什么?WHY?请手动滑动到本章最上面,跟我一起念,类型参数化。问题的关键就在这里,因为将类型作为一种参数,而参数是什么?

    2.3K20

    C#详解

    使用 下面是用来重写上面的栈,用一个通用的数据类型T来作为一个占位符,等待在实例化时用一个实际的类型来代替。...类实例化的理论 C#类在编译时,先生成中间代码IL,通用类型T只是一个占位符。...由以上示例可知,C#是在实例的方法被调用时检查重载是否产生混淆,而不是在类本身编译时检查。同时还得出一个重要原则: 当一般方法与方法具有相同的签名时,会覆盖方法。...的使用范围 本文主要是在类中讲述,实际上,还可以用在类方法、接口、结构(struct)、委托等上面使用,使用方法大致相同,就不再讲述。 小结 C# 是开发工具库中的一个无价之宝。...尽管 C# 的根基是 C++ 模板,但 C# 通过提供编译时安全支持将提高到了一个新水平。C# 利用了两阶段编译、元数据以及诸如约束一般方法之类的创新性的概念。

    96821

    Java进阶:【】认识方法,类,接口通配符

    什么是就相当于标签 形式: jdk1.5之后,用来解决元素类型不确定的数据保存操作, 例如关于这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个类型参数叫做...对应的类型都是引用类型不能是基本类型 接口 声明类时传入类型实参 创建类对象时,传入类型实参 类型实参为空时,默认为Object类型 继承类: 1.父类不传入类型实参...,默认为Object类型 2.父类传入类型实参,子类既可以是类,也可以不是 3.父类传入类型实参,则子类必须是类,且子类的类型形参列表必须包含父类的类型形参列表 类的定义实例化...* test01就是一个类 * 里面就是一个参数类型,但是这个类型是什么?...,不是带的方法就是方法,方法有要求:这个方法的参数类型要和当前类的方法的无关 换个角度:方法对应的那个参数类型当前所在的这个类,是否为类,是啥,无关 方法定义的时候

    3.4K10

    C#的用处

    C#赋予了代码更强的类型安全,更好的复用,更高的效率,更清晰的约束。 C#能力由CLR在运行时支持,区别于C++的编译时模板机制,java的编译时的“搽拭法”。...C#类在编译时,先生成中间代码IL,通用类型T只是一个占位符。...C# 是开发工具库中的一个无价之宝。它们可以提高性能、类型安全质量,减少重复性的编程任务,简化总体编程模型,而这一切都是通过优雅的、可读性强的语法完成的。...尽管 C# 的根基是 C++ 模板,但 C# 通过提供编译时安全支持将提高到了一个新水平。C# 利用了两阶段编译、元数据以及诸如约束一般方法之类的创新性的概念。...当然,C#还很多应用,现在我还只是了解了它的机制原理,在接下来的学习中我会系统得学习所支持的抽象,接口,结构委托等!

    1.3K10

    C#基础篇——

    可以创建:接口、类、方法、事件委托 开始 类封装不特定于特定数据类型的操作。类最常见用法是用于链接列表、哈希表、堆栈、队列树等集合。...在c#中,通过尖括号“”将类型参数括起来,表示。声明接口时,与声明一般接口的唯一区别是增加了一个。一般来说,声明接口与声明非接口遵循相同的规则。...关键字只适用于委托接口,不适用于类、结构方法 不包括inout关键字的委托接口类型参数叫做不变 缓存 在前面我们学习过,类中的静态类型无论实例化多少次,在内存中只会有一个。...5、Queue、Stack SortedList 类分别对应于与其同名的非类。6、LinkedList 是一个通用链接列表,它提供运算复杂度为 O(1) 的插入移除操作。...使用编程就不必进行装箱拆箱操作了。 参考 文档 《C#图解教程》

    1.3K40

    C#方法解析

    C#2.0引入了这个特性,由于的引入,在一定程度上极大的增强了C#的生命力,可以完成C#1.0时需要编写复杂代码才可以完成的一些功能。...是CLRC#提供的一种特殊机制,支持另一种形式的代码重用,即“算法重用”。实现了类型方法的参数化,类型方法也可以让参数告诉使用者使用什么类型。    ...CLR允许创建引用值类型,但是不允许创建枚举,并且CLR允许创建接口委托,CLR允许在引用类型、值类型或接口中定义方法。...定义类型或方法时,为类型指定了任何变量(如:T)都称为类型参数。(T是一个变量名,在源代码中能够使用一个数据类型的任何位置,都可以使用T)在C#参数变量要么成为T,要么至少一大写T开头。...C#编译器支持在调用一个方法时进行类型推断。执行类型推断时,C#使用变量的数据类型,而不是由变量引用的对象的实际类型。

    3.4K90

    C#方法

    C#编程中,方法是一种强大的工具,它允许开发者编写与特定类型无关的代码。方法使用类型参数,这些参数在调用方法时被指定,从而使得同一个方法可以用于不同的数据类型。...这种灵活性使得方法在.NET框架中广泛应用,特别是在集合操作、数据处理算法实现等方面。本文将深入探讨C#中的方法,包括它们的基本概念、实现方式、高级用法最佳实践。1....1.2 方法的特点类型安全:方法在编译时检查类型安全。代码重用:方法可以用于不同的数据类型,从而实现代码重用。性能:方法避免了装箱拆箱操作,提高了性能。2....实现方法2.1 声明方法方法的声明包括指定类型参数。...4.3 避免使用方法进行复杂的继承结构复杂的继承结构会使代码难以理解维护。4.4 使用方法来实现算法方法是实现通用算法的理想选择,如排序、搜索等。

    84300

    C# 中关于

    前言 C# 里面的不仅可以使用型函数、接口,也可以使用类、委托等等。在使用的时候,它们会自行检测你传入参数的类型,因此它可以为我们省去大量的时间,不用一个个编写方法的重载。...一、类型参数运行时中的 1.1、类型参数 在类型或方法定义中,类型参数是在其创建类型的一个实例时,客户端指定的特定类型的占位符。...Stack 类的一个实例 由于引用类型的数量因程序不同而有较大差异,因此通过将编译器为引用类型的类,创建的专用类的数量减少至 1,这样C# 实现,可极大减少代码量。...使用值类型或引用类型参数,实例化 C# 类时,反射可在运行时对其进行查询,且其实际类型类型参数皆可被确定。...使用,可以对类型进行 where 约束,限制其可以接受的类型。这可以帮助我们确保代码只能在特定类型上运行,并提供更严格的类型检查。 C# 中提供了更加灵活、安全高效的编程方式。

    39820

    C#接口

    C#中,接口是编程的核心构建块之一。它们允许开发者定义与特定类型无关的操作方法,从而提高代码的重用性灵活性。接口在.NET框架中广泛应用,特别是在集合、委托事件处理等方面。...本文将深入探讨C#中的接口,包括它们的基本概念、实现方式、高级用法最佳实践。1. 接口的基本概念1.1 什么是接口接口是一种支持编程的接口,它使用类型参数来定义接口的方法属性。...实现接口2.1 声明接口接口的声明包括指定类型参数。...接口的高级特性3.1 约束接口可以使用约束来限制实现类的类型参数。...4.3 避免使用接口进行复杂的继承结构复杂的继承结构会使代码难以理解维护。4.4 使用接口来实现算法接口是实现通用算法的理想选择,如排序、搜索等。

    89000

    C#中的

    C#中的 2008-12-17 作者: 张子阳 分类: C# 语言 .Net 1.1版本最受诟病的一个缺陷就是没有提供对的支持。...为什么要有? 我想不论大家通过什么方式进入了计算机程序设计这个行业,都免不了要面对数据结构算法这个话题。...这是一个最典型的应用,可以看到,通过使用,我们极大地减少了重复代码,使我们的程序更加清爽,类就类似于一个模板,可以在需要时为这个模板传入任何我们需要的类型。...在.Net中,实现比较的基本方法是实现IComparable接口,它有版本两个版本,因为我们现在正在讲解,而可能你还没有领悟,为了避免你的思维发生“死锁”,所以我们采用它的非版本...总结 本节中我们学习了掌握所需要的最基本知识,你看到了需要的原因,它可以避免重复代码,还学习到了如何使用类型参数约束方法。拥有了本节的知识,你足以应付日常开发中的大部分场景。

    1.2K70
    领券