多态概念:让一个对象能够表现多种状态(类型)
实现多态的手段;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("技术部全体员工开始工作");
}
}
}
运行结果: