定义:多态就是指不同对象收到相同消息时,会产生不同行为,同一个类在不同的场合下表现出不同的行为特征
作用:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
实现: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("小猫叫");
}
}