C#面向对象之多态(cp是什么意思?)
C#面向对象之多态(cp是什么意思?)
一、多态
多态是从继承中引出来的概念,即不同的派生类对基类的相同方法表现出不同的行为。如下面例子中动物的游泳方法:
当用户使用派生类鸡的游泳方法时,由于基类的游泳方法满足鸡的需求,则直接调用基类的游泳方法返回不会;当用户使用派生类狗和蛙的游泳方法时,由于基类的游泳方法的实现不满足狗和蛙的需求,所以狗和蛙需要实现自己的逻辑。如何实现狗的狗刨和蛙的蛙泳?答案是重写(使用关键字virtual和override在派生类中重新实现基类的同名方法)。
上面的例子中,不同的派生类(鸡、狗、蛙)对基类(动物)的游泳方法表现出各自不同的结果,即类的多态特性。
也可以使用另一种方式覆盖来实现类的多态特性,即派生类使用new关键字来实现与基类同名方法的不同行为。
注:主要使用的情况是当我们没有修改基类的权限又希望实现派生类的多态特性时。
二、C#关键字:base
在派生类的方法中使用“base.基类方法名”可以复用基类的方法。
三、C#关键字:sealed
由于被override修饰的方法是隐式可重写的,所以当我们不希望被override修饰的方法被重写时,可以使用sealed关键字防止被重写。
注:在防止被重写中,sealed关键字必须与override关键字相同存在。
四、抽象类和抽象方法
当一个基类的作用只是为派生类提供公共成员,而无其他实际意义时,我们不希望用户通过new关键字创建这个基类,可将基类设计成抽象类,这样用户就不能用new关键字创建它。使用abstract关键字修饰类可使其变成抽象类。
当抽象类的某个方法在派生类中表现出多态性时,这个方法的实现对派生来说是无用的,我们希望所有派生类必须重写基类的这个方法,可将这个方法设计成抽象方法,这样抽象类的抽象方法不用提供默认实现并且派生类必须使用override重写此抽象方法。如果派生类不重写这个抽象方法自身也将成为一个抽象类。使用abstract关键字修饰方法可使其变成抽象方法。
五、几种概念的对比
1、重载与重写
重载和重写的相同点在于他们都是对同名的方法使用。
重载和重写的不同点:在使用范围上,前者使用在单个类中,后者使用在两个或多个有继承关系的类中;在使用意图上,前者是写法上的简化,后者是功能上的扩展。
2、重写与覆盖
重写与覆盖的相同点在于他们都是对基类同名方法的扩展。
重写与覆盖的不同点在于,前者倾向于派生类的同名方法,后者倾向于基类的同名方法(在A a = new B(),B继承于A的结构中);前者用于主动设计,后者用于被动修改。
3、虚方法和抽象方法
虚方法与抽象方法的相同点在于他们都可以被重写。
虚方法与抽象方法的不同点:在使用范围上前者大于后者,前者使用在非密封类中,后者只能使用在抽象类中;在使用方式上,前者必须有实现部分,后者不能有实现部分;在派生类中,前者可重写可不重写,后者必须重写。
4、抽象类与接口类型的区别(见C#接口类型)
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~