美文网首页
15-02-多态的应用

15-02-多态的应用

作者: D丝学编程 | 来源:发表于2021-04-08 16:59 被阅读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("恭喜您领养动物成功!");

相关文章

  • 15-02-多态的应用

    多态: 多态是同一个行为具有多个不同表现形式或形态的能力。 多态的应用场景: (1)将父类作为参数进行传递。 (2...

  • JAVA面向对象学习(多态性)

    多态性的理解和应用 1.1. 多态性的理解 多态性:在Java中,多态性是它的一大特性,可以理解成为是事物的多种形...

  • iOS 语言三大特性

    封装 、 继承、多态OC学习篇之---类的三大特性(封装,继承,多态) - Android应用安全防护和逆向分析-...

  • 深入深刻深到不能再深的理解java中的重载和重写

    面向对象的三个特性 面向对象有三个重要的特性:多态,继承,封装。 多态的表现 多态的在java中的应用体现在方法的...

  • python高级编程第一讲:深入类和对象

    1.鸭子类型和多态 多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚"鸭子类型" 所谓多态:...

  • 多态消息的理解

    对象有一个奇妙的机制就是多态消息。 刚看到这句话时就一个想法:什么鬼?后来才知道其实就是多态的应用。 那么多态消息...

  • 面向对象的三大特性之三——多态

    多态:通过一个父类引用多个子类(将父类对象应用于子类的特征),这就叫多态。 例子:桌子上有几杯酒,我们只知道这是酒...

  • 1.9 多态基本概念

    本小节知识点: 【了解】什么是多态? 【掌握】多态的条件 【了解】多态的优点 1.什么是多态? 什么是多态:多态就...

  • C++ 的多态(Polymorphism), virtual f

    多态 c++支持两种多态,编译时多态和运行时多态但其实编译时多态根本不是真正的多态,编译时多态就是函数的重载,ov...

  • 详解Java多态

    详解Java多态 多态定义 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态...

网友评论

      本文标题:15-02-多态的应用

      本文链接:https://www.haomeiwen.com/subject/wyzlxltx.html