8. 多态
Posted LiuChangwei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8. 多态相关的知识,希望对你有一定的参考价值。
类的多态:
(1)多态性就是指在程序运行时,不同对象对同一个方法调用的不同行为。即执行的虽然是一个调用方法的语句,却可以根据派生类对象的不同类型完成不同方法的具体实现;
(2)实现多态性:方法重载、方法覆盖、方法重写、接口实现。
1、方法重载:同一类中,方法名相同,参数的列表与返回值不同。
2、方法覆盖:子类继承父类而且这是必须的,在子类里重新定义这个方法。
3、方法重写:重写方法用相同的签名重写所继承的方法,即具有相同的方法名、返回类型和参数表。
一、若一个实例方法的声明中含有virtual修饰符,则称该方法为虚方法。此方法在子类中可以重写(使用关键字override);
二、抽象方法:
(1)抽象类不明确提供实现方法,必须由其子类实现他的抽象方法;
(2)定义基类中的抽象方法,则派生类必须重写该方法;
(3)抽象方法一定属于抽象类,但抽象类不一定要包含抽象方法;
(4)如果我们不需要使用父类创建对象,他的存在只是为供子类继承。可以将父类写成抽象(关键字abstract)类,将父类写成抽象方法,子类中的方法仍用关键字override重写。
例1:虚方法的创建与调用:
1 class class1 //新建一个类 2 { 3 //默认的方法是被指定为私有的,只能在当前类中进行访问。若需要在其他类中进行访问, 4 //就需要将其指定为public 5 public virtual void virtualMethod()//新建一个虚方法 6 { 7 Console.WriteLine("这是一个虚方法"); 8 } 9 10 public void notVirtualMethod()//新建一个非虚方法 11 { 12 Console.WriteLine("这是一个非虚方法"); 13 } 14 } 15 class Program 16 { 17 static void Main(string[] args) 18 { 19 //调用虚方法和非虚方法 20 class1 c1 = new class1(); 21 c1.virtualMethod(); 22 c1.notVirtualMethod(); 23 Console.ReadKey(); 24 } 25 }
例2:重写虚方法:
1 class class1 //新建一个类 2 { 3 //新建一个虚方法, 4 //如果在方法中加入sealed关键字, 5 //即public virtual sealed void virtualMethod()则不允许class2重写方法 6 public virtual void virtualMethod() 7 { 8 Console.WriteLine("这是一个虚方法,可以被重写"); 9 } 10 } 11 12 //再建一个继承类用于重写方法,class2继承与class1 13 class class2 : class1 14 { 15 public override void virtualMethod() 16 { 17 Console.WriteLine("这是一个重写方法"); 18 } 19 }
4、接口实现:(接口名称一般以“I”作为首字母)
(1)接口是指定一组函数成员而不实现成员的引用类型,其他类型-类和结构可以实现接口;
(2)接口声明不包括数据成员,只能包含方法、属性、事件、索引等成员;
(3)可以利用接口实现多态,同时接口也弥补了C#单一继承的弱点;
(4)interface关键字定义接口,接口成员的访问级别是默认的(public);
(5)接口一旦被实现,实现类必须实现接口中的所有成员,除非实现类本身是抽象类。
5、sealed密封类:
(1)密封类表示不能继承该类,密封方法表示不能重写该方法;
(2)可以覆盖父类的密封方法,与父类中的方法是否为密封没有关系。
6、关键字的理解:
(1)interface:引入方法的名称,需要实现接口里面所有的方法;
(2)virtual:方法的第一个实现,以后还希望子类去不断完善重写他;
(3)override:方法的另一个实现;
(4)sealed:方法的最后一个实现。方法已经很完善了,我们不需要子类去重写他。
7、使用什么方法实现多态,取决于我们是否需要使用基类实例化的对象。需要时使用虚方法,不需要时使用抽象类。
以上是关于8. 多态的主要内容,如果未能解决你的问题,请参考以下文章