定义:多态就是指不同对象收到相同消息时,会产生不同行为,同一个类在不同的场合下表现出不同的行为特征
作用:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
实现:1.抽象方法;2.虚方法;3.接口
个人理解:将不同的子类对象赋值给父类对象,父类对象的同一个方法,会执行不同的代码,产生不同的效果
本文讲解抽象方法和虚方法两种实现方式,看代码:
class Program { static void Main(string[] args) { Animal animal_dog = new Dog(); Animal animal_cat = new Cat(); //调用普通方法 Dog dog = new Dog(); Cat cat = new Cat(); animal_dog.Drink();//动物喝/未实现多态 dog.Drink();//小狗喝/已覆盖父类方法/未实现多态 cat.Drink();//动物喝/未覆盖父类方法/未实现多态 //调用虚函数 animal_dog.Eat();//小狗吃/已重写/已实现多态 animal_cat.Eat();//动物吃/未重写/未实现多态 //调用抽象方法 animal_dog.Bark();//小狗叫/已重写/已实现多态 animal_cat.Bark();//小猫叫/已重写/已实现多态 Console.ReadKey(); } } //含有抽象方法的类必须是抽象类, abstract class Animal { //1.抽象方法,子类继承了抽象类,必须重写该类所有抽象方法 //Animal.Bark()调用的是子类的方法 public abstract void Bark(); //2.虚函数,子类可以重写,也可以不重写 //重写:Animal.Eat()调用的是子类的方法 //不重写:Animal.Eat()调用的是父类的方法 public virtual void Eat() { Console.WriteLine("动物吃"); } //普通方法,子类可以使用new关键字覆盖 //不管是否覆盖:Animal.Drink()调用的都是父类的方法 //覆盖:Dog.Drink()调用的是子类的方法 //不覆盖:Cat.Drink()调用的是父类的方法 public void Drink() { Console.WriteLine("动物喝"); } } class Dog : Animal { public override void Bark() { Console.WriteLine("小狗叫"); } public override void Eat() { Console.WriteLine("小狗吃"); } public new void Drink() { Console.WriteLine("小狗喝"); } } class Cat : Animal { public override void Bark() { Console.WriteLine("小猫叫"); } }