什么是多态?为什么要使用多态?什么时候用多态?多态是如何实现的?使用多态有什么好处?

  在学习《大话设计模式》的时候经常会遇到多态,但什么是多态?为什么要使用多态?什么时候用多态?多态是如何实现的?使用多态有什么好处?我们将根据以上五个问题展开激烈的讨论。

什么是多态?

  多态,顾名思义指“多种形态”。多态表示不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。

例:猪、狗、猫都属于动物类,我们将动物类作为父类,猪“哼哼叫”,狗“汪汪叫”,猫“喵喵叫”,猪、狗、猫三者都能叫,但三者都要通过重写父类的方法才能实现。

为什么要使用多态?使用多态有什么好处?

  我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。

代码重用,也称代码复用, 就是说你把一个功能写成一个模块, 以便再次需要相同功能的时候,可以直接使用,而不用重新开发。
举例: 假如你的网站需要验证码, 你就可以把验证码这个功能单独提取出来以便复用。
通常代码复用是通过类与对象来实现的, 这也是面向对象编程与面向过程编程最主要的区别之一。

  作为面向对象的三大特性之一,多态也有代码重用的功能,还有解决项目中紧耦合的问题,提高程序的可扩展性·。

举例:添加一个子类,继承父类,重写父类的方法。至此,该程序的扩展性得到了提升,而又不需要查看源代码是如何实现的就可以扩展新功能。

什么时候用多态?

  • 方法中的参数
    class Program
    {
        static void Main(string[] args)
        {
            Person p=new Person();
            Audi audi=new Audi();
            p.setDriver(audi);
            p.drive();
            SBenz benz=new SBenz();
            p.setDriver(benz);
            p.drive();
        }
    }

    public abstract class Driver
    {
        public abstract void run();
    }

    class SBenz : Driver
    {
        public override void run()
        {
            Console.WriteLine("大奔");
        }
    }

    class Audi:Driver
    {
        public override void run()
        {
            Console.WriteLine("奥迪");
        }
    }

    class Person
    {
        private Driver driver;
        public Person() { }

        public Person(Driver driver)
        {
            this.driver = driver;
        }

        public void drive()
        {
            driver.run();
        }

        public void setDriver(Driver driver)
        {
            this.driver = driver;
        }
    }
  • 方法的返回类型
    public class CarFactory
    {
        public static Driver createCar(string carName)
        {
            
            if (carName.Equals("Audi"))
            {
                return new Audi();
            }
            else if (carName.Equals("Benz"))
            {
                return new SBenz();
            }
            else
            {
                Console.WriteLine("出门左拐");
                return null;
            }
        }
    }

多态是如何实现的?

  • 父类是抽象类,方法是抽象方法(没有方法体,也不能实例化),子类重写父类的方法
  • 父类中是虚方法(有方法体,能实例化),子类重写父类的方法

小结

  • 虚方法一定要有方法体(哪怕只是大括号),抽象方法一定没有方法体
  • 虚方法可以被子类重写,抽象方法必须被子类重写
  • 如果我们不需要使用父类创建对象,它的存在只是为供子类继承。可以将父类写成抽象(关键字abstract)类,将父类的方法写成抽象方法,子类中的方法仍用关键字override重写
  • 抽象类不能被实例化
  • 多态是指类可以有多种形态,通过修改可以形成多个的实现方法。当子类从父类继承时,它会获得父类的所有方法、字段、属性和事件。若要更改父类的数据和行为,通常有两种选择,第一种是在子类的访问修饰符后加new,就是隐藏了基类(父类)的方法,第二种是在子类中重写父类的方法,更换方法里的内容。

  耐心点,坚强点,总有一天,你承受过的疼痛会有助于你,生活从来不会刻意亏欠谁,它给了你一块阴影,必会在不远的地方撒下阳光。

  • 19
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
多态(polymorphism)是面向对象编程中的一个重要概念,指的是通过基类的指针或引用来调用派生类的方法,实现不同对象对同一消息的不同响应。 多态使用场景: 1. 父类指针或引用指向子类对象,可以实现对不同子类对象的统一操作。 2. 在函数参数中使用基类指针或引用,可以接受不同派生类对象作为参数,实现参数的多样性。 3. 在函数返回值中使用基类指针或引用,可以根据不同情况返回不同派生类对象,实现灵活的返回类型。 语法体现多态的关键是虚函数(virtual function)和纯虚函数(pure virtual function): 1. 虚函数:在基类中使用virtual关键字声明的成员函数,可以在派生类中进行重写,通过基类的指针或引用调用时会根据对象的实际类型调用相应的派生类方法。 2. 纯虚函数:在基类中使用纯虚函数声明的成员函数,没有实际的实现,在派生类中必须进行重写。基类包含纯虚函数的类称为抽象类,无法直接实例化,只能作为接口使用实现多态的条件: 1. 基类中需要有虚函数或纯虚函数,通过在基类中声明虚函数,可以在派生类中进行重写,实现多态性。 2. 使用基类的指针或引用指向派生类对象,通过基类指针或引用调用虚函数,可以根据对象的实际类型来确定调用哪个派生类的方法。 总的来说,多态通过使用虚函数和基类的指针或引用来实现,可以实现不同对象对同一消息的不同响应,提高代码的灵活性和可维护性。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值