多态是指同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
多态建立在类的继承之上:
- 类成员的 “横向拓展” (类成员越来越多)
- 类成员的 “纵向拓展” (类的行为改变,类的成员的 “版本升高”)
- 类成员的隐藏 (new 关键字)——不常用,因为理解复杂且容易出错
- 类成员的重写 (override 关键字)
- 重写和隐藏发生的条件:函数或属性成员一致,拥有可见性(如父类的是private,那肯定不能重写了),函数或属性签名需要一致(方法名,参数类型,返回类型)
多态:
基于类的重写机制(virtual-override):函数成员的具体行为(版本)由引用的对象决定
class Program { static void Main(string[] args) { Person person = new Person(); person.Show(); Person teacher = new Teacher(); teacher.Show(); //子类方法版本被隐藏 则找寻上一个版本 Person doctor = new Doctor(); doctor.Show(); } } class Person { public virtual void Show() { Console.WriteLine("I am Person"); } } class Teacher : Person { public override void Show() { Console.WriteLine("I am Teacher"); } } class Doctor : Teacher { //在多态状态时 隐藏改方法 public new void Show() { Console.WriteLine("I am Teacher"); } }
基于接口的多态机制:接口的行为由它决定的接口实现
class Program { static void Main(string[] args) { IPerson person = new Person(); person.Show(); IPerson teacher = new Teacher(); teacher.Show(); } } interface IPerson { public void Show(); } class Person : IPerson { public void Show() { Console.WriteLine("I am Person"); } } class Teacher : IPerson { public void Show() { Console.WriteLine("I am Teacher"); } }