ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

三、多态

2022-04-06 16:01:44  阅读:143  来源: 互联网

标签:Animal People 多态 Cat public animal class


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

多态的应用场景:

(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("恭喜您领养动物成功!");

标签:Animal,People,多态,Cat,public,animal,class
来源: https://www.cnblogs.com/wml-it/p/16106865.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有