多态的概念
首先解释下什么叫多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。换句话说,实际上就是同一个类型的实例调用“相同”的方法,产生的结果是不同的。这里的“相同”打上双引号是因为这里的相同的方法仅仅是看上去相同的方法,实际上它们调用的方法是不同的。
(龙生九子,各有不同;有了继承才有了多态)
说到多态,我们不能免俗的提到下面几个概念:重写、虚方法、抽象、接口。
1.虚方法 关键字:virtual
重写 关键字:override
父类中的方法,在子类中并不适用,那么子类需要自主更改继承的方法或者是属性,那父类中加了virtual关键字的方法才可以被子类重写,子类重写父类的方法使用的是override关键字
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 多态 { class Program { static void Main(string[] args) { Bird b = new Bird(); Console.WriteLine(b.fling()); Plane p = new Plane(); Console.WriteLine(p.fling()); Console.ReadKey(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 多态 { public class Fly { //虚方法:virtual public virtual string fling() { return "拍拍翅膀就会飞!"; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 多态 { public class Bird:Fly { } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 多态 { public class Plane:Fly { public override string fling() { return "发动引擎就能飞!"; } } }
2、抽象类
是因为普通的多态虚方法没有人用本身的方法主体。
抽象类就是来当亲爹,abstract,不能实例化。
抽象类中可以有抽象方法:abstract
抽象方法一定在抽象类中,但是抽象类中不一定只有抽象方法,也可以有普通方法
注意:抽象方法只能在抽象类中定义,如果不在抽象类中定义,则会报出如下错误:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 抽象 { class Program { static void Main(string[] args) { Bird b = new Bird(); Console.WriteLine(b.fling()); Console.WriteLine(b.Eat()); Console.ReadKey(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 抽象 { //抽象类 public abstract class Fly { //抽象方法 public abstract string fling(); //普通方法 public string Eat() { return "吃虫子!"; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 抽象 { public class Bird:Fly { public override string fling() { return "拍拍翅膀就能飞!"; } } }
3、接口
1、吃饭,睡觉 - 基础类
2、技能,地点 - 赚钱类
3、娱乐1,娱乐2 - 娱乐类
接口就是出来做 干爹的,接口不是类 interface
编写方法格式: string 方法名();
实现接口的方法 不要override,直接正常编写就可以了;
接口里面只能有抽象方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 接口 { class Program { static void Main(string[] args) { NanRen nr = new NanRen(); Console.WriteLine(nr.Eat()+nr.Sleep()+nr.yule1()); Console.ReadKey(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 接口 { //抽象类 public abstract class Jichulei { public abstract string Eat(); public abstract string Sleep(); } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 接口 { //关键字+接口名 interface zhuanqian { //string +方法名 string JiNeng(); string DiDian(); } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 接口 { interface Yule { string yule1(); string yule2(); } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 接口 { public class NanRen:Jichulei,zhuanqian,Yule { public override string Eat() { return "大口吃"; } public override string Sleep() { return "仰着睡"; } public string JiNeng() { return "编程"; } public string DiDian() { return "中南海"; } public string yule1() { return "打篮球"; } public string yule2() { return "斗地主"; } } }