多态: 多态是同一个行为具有多个不同表现形式或形态的能力。
多态的应用场景:
(1)将父类作为参数进行传递。
(2)将父类作为返回值。
案例一:将父类作为参数传递(模拟人和动物打招呼)
首先看如下代码的缺陷:
class Dog
{
public void Speaking()
{
Console.WriteLine("汪汪汪。。。!");
}
}
class Cat
{
public void Speaking()
{
Console.WriteLine("喵喵喵喵.......");
}
}
class People
{
//人类给狗打招呼
public void SayHi(Dog dog)
{
dog.Speaking();
}
//人类给猫打招呼
public void SayHi(Cat cat)
{
cat.Speaking();
}
}
此时有一个People(人)类,需要实现,和动物打招呼的方法,方法需要传递一个动物进来,那么此时系统中有n种东西,在People类中就需要定义n个方法进行重载。
以下是main方法的调用测试:
Cat cat = new Cat();
Dog dog = new Dog();
People p = new People();
p.SayHi(cat);
p.SayHi(dog);
解决方案:将父类作为参数传递实现多态,如下代码:
class Animal
{
public virtual void Speaking()
{
Console.WriteLine("Hello!");
}
}
class Dog:Animal
{
public override void Speaking()
{
Console.WriteLine("汪汪汪。。。!");
}
}
class Cat:Animal
{
public override void Speaking()
{
Console.WriteLine("喵喵喵喵.......");
}
}
class People
{
//人类给所有动物打招呼
public void SayHi(Animal animal)
{
animal.Speaking();
}
}
此时,People类中的SayHi方法接收父类作为参数,不管系统中有多少种动物,此时SayHi只用编写一次,实现的多态的思想。
以下是main方法的调用测试:
Animal cat = new Cat();
Animal dog = new Dog();
People p = new People();
p.SayHi(cat);
p.SayHi(dog);
案例二:子类 is—a 父类 (模拟人和动物玩游戏,和狗玩飞盘,和猫玩捉迷藏)
class Animal
{
public string name;
}
class Dog : Animal
{
//接飞盘游戏
public void CatchFlyDisc()
{
Console.WriteLine("我和主人正在玩接飞盘的游戏...");
}
}
class Cat : Animal
{
//玩捉迷藏游戏
public void HideAndSeek()
{
Console.WriteLine("我和主人正在玩捉迷藏的游戏");
}
}
class People
{
//和动物玩游戏
public void Play(Animal animal)
{
if(animal is Dog)
{
Dog dog = (Dog)animal;
dog.CatchFlyDisc();
}
if(animal is Cat)
{
Cat cat = (Cat)animal;
cat.HideAndSeek();
}
}
}
此处传递一个动物到Play方法中,但是由于接飞盘和捉迷藏的方法并没有从父类重写,方法名不同,所以在具体实现的时候必须要知道传递过来的animal到底是狗还是猫,可以使用is来进行判断。
在main方法中的调用:
Animal animal = new Cat();
People p = new People();
p.Play(animal); //此时会调用Cat类中的HideAndSeek方法打印消息。
案例三:将父类作为返回值(模拟人领养动物)
首先看如下代码缺陷:
class Dog
{
public string name;
}
class Cat
{
public string name;
}
public class People
{
//此处领养狗的方法
public Dog OwnDog()
{
Dog dog = new Dog();
dog.name = "snoopy";
return dog;
}
//此处领养猫的方法
public Cat OwnCat()
{
Cat cat = new Cat();
cat.name = "tom";
return cat;
}
}
此处缺点在于,People中领养动物的方法,系统中有n中动物,就必须编写n个方法。
在main方法中的调用:
Console.WriteLine("请输入您要领养的动物类型:(1-狗,2-猫)");
int type = int.Parse(Console.ReadLine());
People p = new People();
if(type == 1)
{
p.OwnDog();
Console.WriteLine("恭喜您领养了一只狗!");
}
if(type == 2)
{
p.OwnCat();
Console.WriteLine("恭喜您领养了一只猫!");
}
解决方案:将父类作为返回值实现多态,如下代码:
class Animal
{
public string name;
}
class Dog : Animal
{
}
class Cat : Animal
{
}
class People
{
//父类作为返回值
public Animal OwnAnimal(int type)
{
Animal animal;
if(type == 1)
{
animal = new Dog();
animal.name="snoopy";
}
else if(type == 2)
{
animal = new Cat();
animal.name="tom";
}
else
{
animal = null;
}
return animal;
}
}
此时无论系统中有多少种动物,一个方法就可以搞定。
在main方法中的调用:
Console.WriteLine("请输入您要领养的动物类型:(1-狗,2-猫)");
int type = int.Parse(Console.ReadLine());
People p = new People();
Animal animal = p.OwnAnimal(type);
Console.WriteLine("恭喜您领养动物成功!");