一 多态的定义:
同一种操作作用于不同的类的对象,不同的类的对象进行不同的执行,最后产生不同的执行结果。简单理解:让一种对象表现出来多种类型
二 多态的实现方式(虚方法):
(一)定义:
在基类中用virtual关键字声明的方法叫做虚方法,在派生类中可以通过override关键字进行重写
(二)使用场景:
明确定义了基类,对基类中的方法进行重写时,可以考虑使用虚方法。
(三)例子:
class Person { private string _name; public string Name { get { return _name; } set { _name = value; } } public Person(string name) { this.Name = name; } public virtual void SayHello() { Console.WriteLine("我是人类"); } } class Chinese:Person { public Chinese(string name) : base(name) { } public override void SayHello() { Console.WriteLine("你好,我的姓名是{0},我是中国人",this.Name); } } class Japanese:Person { public Japanese(string name) : base(name) { } public override void SayHello() { Console.WriteLine("你好,我的姓名是{0},我是日本人", this.Name); } } class Program { static void Main(string[] args) { Chinese c1 = new Chinese("小明"); Chinese c2 = new Chinese("小李"); Japanese j1 = new Japanese("井泉宜良"); Japanese j2 = new Japanese("龟田君"); Person[] Pers = { c1, c2, j1, j2 }; //Pers[0] = c1; //Pers[1] = c2; //Pers[2] = j1; //Pers[3] = j2; 上面数组的另外一种写法 for (int i = 0; i < Pers.Length; i++) { Pers[i].SayHello(); } //Person p = new Chinese("小明");//Japanese("bingbian"); //p.SayHello(); Console.ReadKey(); } }
三 多态的实现方式(抽象方法)
(一)定义:
描述共性的类就是抽象类,抽象类中的方法用abstract关键字修饰。其中抽象类并不考虑其实现的具体方式。
(二)成员:
抽象方法和非抽象方法;属性;字段;构造函数;实例成员
(三)使用场景:
1在抽象类定义之前,如果其他类中,没有公共的基类,那么可以通过抽象出来共同的基类来实现共性的方法
2 如果父类中的方法有默认的实现,并且父类需要实例化,这时候可以考虑将 父类定义成一个普通类,用虚方法来实现多态
(四)例子:
class Program { static void Main(string[] args) { Animal an = new Dog(); an.Speak(); Console.ReadKey(); } } public abstract class Animal { public abstract void Speak(); } class Dog:Animal { public override void Speak() { Console.WriteLine("狗汪汪的叫"); } } class Cat:Animal { public override void Speak() { Console.WriteLine("猫喵喵的叫"); } }
(五)注意事项:
1. 抽象类成员必须标记为abstract,并且不能有任何实现,抽象成员必须下抽象类中
2.抽象类不能被实例化
3.子类继承抽象类后,必须把父类中的所有抽象成员都重写(除非子类也是一个抽象类,则不需要重写)
4.抽象成员的访问修饰符不能是private
5.在抽象类中可以包含实例成员,并且抽象类的实例成员可以不被子类实现
6.抽象类中是有构造函数的,虽然不能被实例化
7.如果父类的抽象方法中参数,那么,继承这个抽象父类的子类在重写父类的方法时候必须传入对应的参数。如果抽象父类的抽象方法中有返回值,那么子类在重写这个抽象方法的时候也必须要传入返回值
8.如果父类中的方法有默认的实现,并且父类需要实例化,这时候可以考虑将 父类定义成一个普通类,用虚方法来实现多态
9.如果父类中的方法没有默认的实现。父类也不能实例化,则可以将该类定义为抽象类
四 多态的实现方式(接口)
(一)接口的定义:
接口是一种编程规范、能力,c#本身并不支持类的多重继承,但是通过接口可以实现类的多重继承
(二)成员:
方法;索引器;事件;自动属性(没有字段和方法体的属性);不能有构造函数和字段
(三)使用场景:
要继承多个基类时,基类可以抽象为接口
(四)例子:
class Program { static void Main(string[] args) { Ichlssable ch = new Teacher(); ch.CHLSS(); Console.ReadKey(); } } interface Ichlssable { void CHLSS(); } class Driver { public void KaiChe() { Console.WriteLine("我是一名司机,可以开车"); } } class Teacher:Driver,Ichlssable { public void Teach() { Console.WriteLine("我是一名老师,可以教书"); base.KaiChe(); } public void CHLSS() { Console.WriteLine("我是人类,可以吃喝拉撒睡"); } }
(五)注意事项:
1.一个类继承了接口,这个类就需要实现接口中的所有成员
2.接口不能被实例化,也就是说不能用new创建对象
3.接口的成员中不能加访问修饰符,默认的为public,且不能被修改,接口中的成员不能有任何实现
4.接口和接口之间可以继承,并且可以多继承
5.接口不可以继承一个类,而类可以继承一个接口(接口只能继承类,类可以继承类和接口)
6.实现接口的子类必须实现该接口的全部成员
7.一个类可以同时继承一个类和多个接口,那么被继承类的名必须写在接口名称的前面,并用,隔开
8.显示实现接口的目的是为了解决方法的重命名问题,当继承的接口中的方法和参数一模一样时u,就要用的显示的实现接口。,当一个抽象实现接口的时候,需要子类去实现接口。
9.接口中不能包含实现的方法