多态,不同的对象对同一个方法有不同的响应。
目的,为了解决继承中父类访问子类方法要转型的问题。
还是继承的问题,父类实例化子类,被看成父类类型。
条件:
多态 (3种方式)
1, 基于继承 重写 父类实例子类化(父类的引用指向子类的对象)
2, 抽象类和抽象方法
3, 接口实现
本文主要讲
抽象父类多态(abstract),和虚方法多态(virtual)。
1,抽象多态。
注意点 :
a,抽象方法没有方法体,并且用abstract修饰。
b,抽象方法必须放在抽象类中,类也用abstract修饰。
c,抽象类不能被实例化。
d,抽象类具有强制性。
父类有抽象方法,非抽象子类也必须有。
但是子类也是抽象类,可不必实现。
这样,方便代码规范,管理,及命名标准。
using System;namespace 多态
{class Program{static void Main(string[] args){Console.WriteLine("Hello World!");Person[] p = new Person[2];p[0] = new Student();p[1] = new Hoker();//p 可以作为父类的超级容器, 像窗体 form 一样, 里面可以装很多控件。for (int i = 0; i < p.Length; i++){p[i].Study();//只能访问抽象过的重写方法。对其它方法...字段不行。}//这样父类可以访问子类被重写的方法, 但是要转型才可访问非重写方法。Student x = new 小学生();x.Show();Student s = new Student();s.Study();}}abstract class Person{public abstract void Study();}class Student : Person {string Write;public string learing;public string Write1 { get => Write; set => Write = value; }public override void Study(){Console.WriteLine("我是学生,我要在知识的海洋里遨游。");}public virtual void Show(){Console.WriteLine("学生的虚方法");}}class Hoker : Person {public override void Study(){Console.WriteLine("我是hoker,我要睡便全球。");}}class 小学生 : Student{//多态的强制性只对父子类。public override void Show(){Console.WriteLine("小学生 ,虚方法子类。");}}}/*
结果:
我是学生,我要在知识的海洋里遨游。
我是hoker,我要睡便全球。小学生 ,虚方法子类。
我是学生,我要在知识的海洋里遨游。
*//*
以上代码分析:
person 是抽象类, 父类。里面有抽象方法study() , 子类必须实现。
父类对象, 和子类对象便可实现这个方法,形成多态的一种。student继承了person 重写了study 多态便有了意义。student还有virtual show方法。 子类 小学生 里面的show方法也重写了student的show方法。虚方法也可实现多态。
virtual 没有强制性, 可以不必实现, 实现了就不用转型。hoker类 也继承了person 也重写了 study 方法。p[0] 和 p[1]
x 和 s
都分别对study 和 show 有了不同的反应。
*/
2,虚方法多态。
a,虚方法所在的类,可以不抽象,当成普通类使用。
b,子类可以选择性的实现虚方法,或者不实现,直接继承。
c,虚方法和抽象都解决了父类实例化子类对象需要判断,转型的问题。
d,虚方法没有强制性。