多态,字面理解,即同一事物展示出不同的状态或能力。
在C#中,多态分为静态和动态两种,静态多态性是在编译的时候确定的,动态多态性是在程序运行期间确定的。静态多态性通常通过函数重载和运算符重载实现。动态多态性通常通过继承和方法重写来实现。
今天学习了一下多态性的基本内容,在这做一个整理。
·静态多态性
首先是函数重载,即声明多个名称相同的函数,这些函数可以有参数个数的不同,或者参数类型的不同,总之,除了名称外,同名函数的其他部分不能完全一样,不然没法区分了(不能仅仅是返回值不同)。下面举一个小例子,可以对照学习。
打印结果为:
其次是运算符重载,这个特性即可以将常用的运算符,在不同的场景中赋予独特的用途。下面是重载运算符的重写格式范例:
这个例子是将*乘法运算符进行了重载,即特定范围内,使用*会执行这个{}里面的内容,而不是两数乘法,这里的定义格式,首先是访问修饰符,其次是static,这个静态非静态不强求,但常用的是静态的,如果你将运算符重载为非静态的,那么在使用该运算符时,需要先创建类的实例,然后通过该实例来调用运算符。具体情况看自己的需求,下来是返回值类型,再是operator关键字,这个关键字就是用来声明重载运算符的,然后是具体的运算符,再是参数列表,最后是主体内容。
下面看一个具体的例子:
打印结果为:
这两个例子的代码逻辑都很简单,可以大概看看。
运算符重载这里还有一个问题:不是所有的运算符都支持重载。所有在使用的时候先查查能不能重载再使用。
·动态多态性
动态多态性一般是通过抽象类和虚方法实现的。
先看一下抽象类实现:
抽象类的声明,即在类声明中加入abstract关键字,同一般的类相比,抽象里具有一些不同,首先就是抽象类是不能被实例化的,抽象类中可以定义抽象方法,抽象方法用来实现动态多态性,抽象方法的使用必须通过继承的方式,所以抽象类不能通过sealed设置为密封类。
下面看一个具体的例子:
打印结果为:
动态多态性的第二种实现即为虚方法:
虚方法不需要在抽象类里面,只需要在声明的函数中加入virtual关键字即可。
下面看一个简单的例子:
打印结果为:
这个代码里面的base.teach();即调用父类的teach函数。
虚方法和抽象方法的不同也能看出来,首先虚方法只需要在声明时加入virtual关键字,不需要指明在什么类中,最后继承该类即可,而抽象方法必须写在抽象类中。其次,抽象方法在定义时是不包含方法体的,而虚方法在定义时是有方法体的。这两种方法在重新定义时都需要override关键字。
这就是一些多态的入门内容。