C#入门系列 (二十二) -- 面向对象之多态
基础概念
同一操作作用于不同类的实例、不同的类型将进行不同的解释,产生不同的结果,即为多态。
C#可以通过继承实现多态性,实现的办法为:对基类的成员进行隐藏或覆盖。
隐藏基类的成员
C#规定派生类不能删除它继承的任何成员,但是在派生类中可以隐藏从基类继承的成员,基类的静态成员也可以被派生类隐藏。
要隐藏一个基类的成员需做到如下两点:
对于数据成员来说,需要声明一个新的相同类型的成员,并使用相同的名称;对于函数成员来说,需要声明新的带有相同签名的函数成员;
在派生类中声明用来隐藏基类成员的同名成员时需要使用 new 修饰符。
代码示例:
则在派生类 Cat 中定义隐藏方法的代码为:
覆盖基类的成员
如果有一个派生类对象的引用,使用类型转换运算符把该引用转换成基类类型,就可以获取该对象基类部分的引用,
格式如下所示:
将派生类对象的引用转换成基类引用来访问派生类对象时,得到的是基类的成员。
虚方法提供了使基类引用访问“升至”派生类内的方法。虚方法即为使用关键字 virtual 声明的实例方法;没有使用关键字 virtual 声明的方法称为非虚方法。
借助虚方法使得基类引用调用派生类的方法需要满足下列条件:
派生类的方法和基类的方法具有相同的方法签名和返回类型;
基类的方法必须使用 virtual 声明为虚方法;
派生类的方法需要使用 override 标注为覆写方法。
使用虚方法和覆写方法时还需注意:
虚方法和覆写方法必须具有相同的可访问性;
不能覆写静态方法和非虚方法;
方法、属性、索引以及事件都可以使用 virtual 和 override 进行声明和覆写;
覆写方法可以出现在继承的任意层次上。
virtual 和 abstract
virtual 和 abstract 都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义。
virtual 修饰的方法必须有实现(哪怕是仅仅添加一对大括号),而 abstract 修饰的方法一定不能实现。
virtual 可以被子类重写,而 abstract 必须被子类重写。
如果类成员被 abstract 修饰,则该类前必须添加 abstract,因为只有抽象类才可以有抽象方法。
无法创建 abstract 类的实例,只能被继承无法实例化。
重载和重写:
重载(overload)是提供了一种机制, 相同函数名通过不同的返回值类型以及参数来表来区分的机制。
重写(override):是用于重写基类的虚方法,这样在派生类中提供一个新的方法。
多态代码示例
版权声明: 本文为 InfoQ 作者【陈言必行】的原创文章。
原文链接:【http://xie.infoq.cn/article/f7f078f55ca5ae2557d1d1690】。未经作者许可,禁止转载。
评论