三、多态

博客 分享
0 165
张三
张三 2022-04-06 15:57:37
悬赏:0 积分 收藏

三、多态

多态: 多态是同一个行为具有多个不同表现形式或形态的能力。

多态的应用场景:

(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("恭喜您领养动物成功!");
posted @ 2022-04-06 15:54 農碼一生 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    张三

    张三 (王者 段位)

    821 积分 (2)粉丝 (41)源码

     

    温馨提示

    亦奇源码

    最新会员