面向对象——多态

面向对象的多态

一、概述

多态是面向对象编程中的一个重要概念,它允许不同类型的对象对同一消息做出不同的响应。多态性使得程序可以以一种统一的方式处理不同类型的对象,提高了代码的灵活性和可扩展性。

二、多态的实现方式

2.1 静态多态

静态多态是通过函数重载和运算符重载来实现的。函数重载允许在同一个类中定义多个同名函数,但参数类型或个数不同。运算符重载允许对已有的运算符进行重新定义,使其适用于自定义的类类型。

2.2 动态多态

动态多态是通过继承和虚函数来实现的。继承允许一个类派生出多个子类,子类可以重写父类的成员函数。虚函数是在基类中声明为虚函数的成员函数,它可以在派生类中被重写,并通过基类指针或引用调用派生类的函数。

三、多态的优点

3.1 代码复用

多态性使得不同类型的对象可以共享相同的接口和行为,从而提高了代码的复用性。通过定义一个通用的接口,可以在不同的类中实现不同的功能,减少了代码的重复编写。

3.2 扩展性

多态性使得程序可以轻松地扩展新的类和功能。通过继承和虚函数的机制,可以定义新的子类,并在不修改已有代码的情况下添加新的功能。

3.3 灵活性

多态性使得程序可以以一种统一的方式处理不同类型的对象。通过基类指针或引用调用派生类的函数,可以在运行时确定要调用的函数,从而实现动态绑定和动态调用。

四、多态的应用场景

4.1 多态的参数和返回类型

多态性可以在函数参数和返回类型中使用,提高了代码的灵活性和可扩展性。通过使用基类指针或引用作为函数参数和返回类型,可以接受或返回不同类型的对象。

4.2 多态的容器和算法

多态性可以应用于容器和算法中,实现对不同类型的对象进行统一的管理和操作。通过使用容器和算法的泛型化设计,可以在运行时确定要处理的对象类型。

4.3 多态的事件和消息处理

多态性可以应用于事件和消息处理中,实现对不同类型的事件和消息进行统一的处理。通过定义统一的事件和消息接口,可以在不同的类中实现相应的处理函数。

       可以把不同的子类对象都当作父类来看,进而屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,统一调用标准。

多态的主要用途

1、提高程序的可扩展性;
2、降低系统耦合度;
3、提高系统的可维护性。

示例

       结合大话设计模式,第9页-第11页的代码,通过简单工厂模式实现计算器小程序,深刻理解面向对象的多态。

Operation-运算类

public class Operation
    {
        private double _numberA = 0;
        private double _numberB = 0;
 
        public double NumberA
        {
            get { return _numberA; }
            set { _numberA = value; }
 
        }
        public double NumberB
        {
            get { return _numberB; }
            set { _numberB = value; }
        }
        public virtual double GetResult()
        {
            double result = 0;
            return result;
        }
     }

OperationFactory-简单运算工厂类


class OperationFactory
    {
        public static Operation createOperate(string operate)
        {
            Operation oper=null;
 
            switch (operate)
            {
                case "+":
                    oper = new OperationAdd();
                    break;
                case "-":
                    oper=new OperationSub();
                    break;
                case "*":
                    oper=new OperationMul();
                    break;
                case "/":
                    oper=new OperationDiv();
                    break;
 
            }
            return oper;
        }
     }

OperationAdd-加法类


class OperationAdd:Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA + NumberB;
            return result;
        }
    }

OperationSub-减法类

public class OperationSub:Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA + NumberB;
            return result;
        }
    }

OperationMul-乘法类

class OperationMul:Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA + NumberB;
            return result; 
        }
    }

OperationDiv-除法类


class OperationDiv:Operation
    {
        public override double GetResult()
        {
            double result = 0;
            if (NumberB==0)
            {
                throw new Exception("除数不能为0.");
            }
            result = NumberA + NumberB;
            return result;
        }
    }

客户端代码

 Operation oper;
    oper = OperationFactory.createOperate("+");
    oper.NumberA = 1;
    oper.NumberB = 2;
    double result = oper.GetResult();
    Console.WriteLine(result);
    

       根据代码可知,Operation类是父类,加减乘除是Operation的子类。在各个子类中重写了父类中的GetResult方法,对于父类的同一个方法,各个子类有不同的实现,符合多态的概念。

多态的前提

多态的前提:必须是类与类之间有关系。要么继承,要么实现。
多态(英语:polymorphism):指为不同数据类型的实体提供统一的接口。把概念对应到代码上,如下图所示:
在这里插入图片描述

在这里插入图片描述
在上图中OperationAdd、OperationSub、OperationMul和OperationDiv对应到概念上是不同数据类型的实体。
在这里插入图片描述

不同的数据类型的实体有相同的方法(统一的接口),方法有不同的实现。在这里GetResult是加减乘除类的相同的方法。

五、总结

多态是面向对象编程中的一个重要概念,通过函数重载、运算符重载、继承和虚函数实现。多态性提高了代码的灵活性、可扩展性和复用性,使得程序可以以一种统一的方式处理不同类型的对象。多态性可以应用于参数和返回类型、容器和算法、事件和消息处理等场景中。通过合理应用多态性,可以提高代码的可读性、可维护性和可扩展性。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨思默

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值