多态概念:让一个对象能够表现多种状态(类型)
实现多态的手段;1、虚方法 2、抽象类,3、接口
1、虚方法将父类的方法标记为虚方法使用关键字virtual,这个方法可以被子类重写一遍
实现多态的手段;1、虚方法 2、抽象类,3、接口
1、虚方法将父类的方法标记为虚方法使用关键字virtual,这个方法可以被子类重写一遍
虚方法:将子类父类的方法标记为虚方法用关键字:virtual。这个函数可以被子类重写override
使用需方法最主要的是找出父类
代码分析
1.不适用虚方法时
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _01201多态 { class Program { static void Main(string[] args) { Person m1 = new Person("Person"); Person m2 = new Person("People"); Chinese m3 = new Chinese("孔子"); Chinese m4 = new Chinese("孟子"); Japanese m5 = new Japanese("竹下俊"); Japanese m6 = new Japanese("春上数"); Russians m7 = new Russians("诺维斯基"); Russians m8 = new Russians("高尔基"); American m9 = new American("凯蒂派里"); American m10 = new American("范迪塞尔"); Person[] per = {m1,m2,m3,m4,m5,m6,m7,m8,m9,m10};//里式转换法 for (int i = 0; i < per.Length ; i++) { //per[i].PrintInfo(); if (per[i] is American) { ((American)per[i]).PrintInfo(); } else if (per[i] is Chinese) { ((Chinese)per[i]).PrintInfo(); } else if (per[i] is Russians) { ((Russians)per[i]).PrintInfo(); } else if (per[i] is Japanese) { ((Japanese)per[i]).PrintInfo(); } else { per[i].PrintInfo(); } } Console.ReadKey(); } } class Person { private string _name; //私有字段 public string Name //字段的属性 { get { return _name; } set { _name = value; } } public void PrintInfo() //打印信息的方法 { Console.WriteLine("我是人类\t我叫{0}", this.Name); } public Person(string name) //有参构造函数 { this.Name = name; } } class Chinese : Person { public void PrintInfo()//打印信息的方法与父类重名 { Console.WriteLine("我是中国人\t我叫{0}", this.Name); } public Chinese(string name) //Chinese类的构造函数显示的调用父类的有参构造函数 : base(name) { } } class American : Person { public void PrintInfo() { Console.WriteLine("我是美国人\t我叫{0}", this.Name);//打印信息的方法 } public American(string name)//有参构造函数显式的调用父类的有参构造函数 : base(name) { } } class Japanese : Person { public void PrintInfo()//打印信息的方法,和父类重名 { Console.WriteLine("我是日本人\t我叫{0}", this.Name); } public Japanese(string name)//有参构造函数显式的调用父类的有参构造函数 : base(name) { } } class Russians : Person { public void PrintInfo() { Console.WriteLine("我是俄罗斯人\t我叫{0}",this.Name); } public Russians(string name) : base(name) { } } }
使用多态虚方法后可以减少代码量
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _01202多态 { class Program { static void Main(string[] args) { Person m1 = new Person("Person"); Person m2 = new Person("People"); Chinese m3 = new Chinese("孔子"); Chinese m4 = new Chinese("孟子"); Japanese m5 = new Japanese("竹下俊"); Japanese m6 = new Japanese("春上数"); Russians m7 = new Russians("诺维斯基"); Russians m8 = new Russians("高尔基"); American m9 = new American("凯蒂派里"); American m10 = new American("范迪塞尔"); Person[] per = { m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, new English("贝克汉姆"),new English("憨豆") };//里式转换法 for (int i = 0; i < per.Length; i++) { per[i].PrintInfo();//这是的对象表现出多种状态 } Console.ReadKey(); } } class Person { private string _name; //私有字段 public string Name //字段的属性 { get { return _name; } set { _name = value; } } public virtual void PrintInfo() //打印信息的方法 { Console.WriteLine("我是人类\t我叫{0}", this.Name); } public Person(string name) //有参构造函数 { this.Name = name; } } class Chinese : Person { public override void PrintInfo()//打印信息的方法与父类重名 { Console.WriteLine("我是中国人\t我叫{0}", this.Name); } public Chinese(string name) //Chinese类的构造函数显示的调用父类的有参构造函数 : base(name) { } } class American : Person { public override void PrintInfo() { Console.WriteLine("我是美国人\t我叫{0}", this.Name);//打印信息的方法 } public American(string name)//有参构造函数显式的调用父类的有参构造函数 : base(name) { } } class Japanese : Person { public override void PrintInfo()//打印信息的方法,和父类重名 { Console.WriteLine("我是日本人\t我叫{0}", this.Name); } public Japanese(string name)//有参构造函数显式的调用父类的有参构造函数 : base(name) { } } class Russians : Person { public override void PrintInfo() { Console.WriteLine("我是俄罗斯人\t我叫{0}", this.Name); } public Russians(string name) : base(name) { } } class English : Person { public English(string name) : base(name) { } public override void PrintInfo() { Console.WriteLine("我是英国人\t我叫{0}",this.Name); } } }运行结果:
虚方法的练习:老板宣布开始工作,人事部全体成员开始工作,销售部全体成员开始工作,技术部全体成员开始工作
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _0120301多态虚方法练习 { class Program { static void Main(string[] args) { //boss 宣布上班 //人事部开全体员工开始工作 //销售部全体员工开始工作 //技术部全体员工开始工作 Boss b = new Boss(); Boss pd = new PersonnalDepartment();//人事部 Boss sd = new SalesDepartment();//销售部 Boss td = new TechnicDepartment();//技术部 b.StartWork(); pd.StartWork(); sd.StartWork(); td.StartWork(); Console.ReadKey(); } } public class Boss { public virtual void StartWork() // 父类的虚方法 { Console.WriteLine("全体员工开始工作"); } } public class PersonnalDepartment : Boss //人事部类 { public override void StartWork() //重写父类虚方法方法 { Console.WriteLine("人事部全体成员开始工作"); } } public class SalesDepartment : Boss //销售部 { public override void StartWork() //重写父类虚方法方法 { Console.WriteLine("销售部全体员工开始工作"); } } public class TechnicDepartment : Boss //技术部类 { public override void StartWork() //重写父类虚方法方法 { Console.WriteLine("技术部全体员工开始工作"); } } }
运行结果: