• 面向对象理解——多态


    何为多态

    定义:

    多态是指不同的子类在继承父类后分别都重写覆盖了父类的方法,即父类同一个方法,在继承的子类中表现出不同的形式。系统在运行时(而非编译时),能够根据其类型确定调用哪个重载的成员函数的能力,称为多态性。

    特点:

    (1)多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态。

    (2)多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话。

    (3)对不同类的对象发出相同的消息将会有不同的行为。

    (4)多态允许将子类的对象当作父类的对象使用,某父类型的引用指向其子类型的对象,调用的方法是该子类型的方法。这里引用和调用方法的代码编译前就已经决定了,而引用所指向的对象可以在运行期间动态绑定。

    (5)多态分为编译时多态(函数参数个数不同或者参数类型不同)和运行时多态(虚函数和纯虚函数)。

    作用:

    (1)应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。

    (2)派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。

    (3)隐藏实现细节,使得代码能够模块化(虚函数)。

    代码实现

    运算类:

    1. /**
    2. * @author : [LiuYanQiang]
    3. * @version : [v1.0]
    4. * @className : Operation
    5. * @description : [运算类]
    6. * @createTime : [2022/5/27 20:04]
    7. * @updateUser : [LiuYanQiang]
    8. * @updateTime : [2022/5/27 20:04]
    9. * @updateRemark : [描述说明本次修改内容]
    10. */
    11. public abstract class Operation {
    12. private double _numberA;
    13. private double _numberB;
    14. public double get_numberA() {
    15. return _numberA;
    16. }
    17. public void set_numberA(double _numberA) {
    18. this._numberA = _numberA;
    19. }
    20. public double get_numberB() {
    21. return _numberB;
    22. }
    23. public void set_numberB(double _numberB) {
    24. this._numberB = _numberB;
    25. }
    26. public abstract double getResult();
    27. }

    加法类:

    1. /**
    2. * @author : [LiuYanQiang]
    3. * @version : [v1.0]
    4. * @className : OperationAdd
    5. * @description : [加法类]
    6. * @createTime : [2022/5/27 20:13]
    7. * @updateUser : [LiuYanQiang]
    8. * @updateTime : [2022/5/27 20:13]
    9. * @updateRemark : [描述说明本次修改内容]
    10. */
    11. public class OperationAdd extends Operation {
    12. @Override
    13. public double getResult() {
    14. double result = 0;
    15. result = super.get_numberA() + super.get_numberB();
    16. return result;
    17. }
    18. }

    减法类:

    1. /**
    2. * @author : [LiuYanQiang]
    3. * @version : [v1.0]
    4. * @className : OperationSub
    5. * @description : [减法类]
    6. * @createTime : [2022/5/27 20:13]
    7. * @updateUser : [LiuYanQiang]
    8. * @updateTime : [2022/5/27 20:13]
    9. * @updateRemark : [描述说明本次修改内容]
    10. */
    11. public class OperationSub extends Operation {
    12. @Override
    13. public double getResult() {
    14. double result = 0;
    15. result = super.get_numberA() - super.get_numberB();
    16. return result;
    17. }
    18. }

    乘法类:

    1. /**
    2. * @author : [LiuYanQiang]
    3. * @version : [v1.0]
    4. * @className : OperationMul
    5. * @description : [乘法类]
    6. * @createTime : [2022/5/27 20:15]
    7. * @updateUser : [LiuYanQiang]
    8. * @updateTime : [2022/5/27 20:15]
    9. * @updateRemark : [描述说明本次修改内容]
    10. */
    11. public class OperationMul extends Operation {
    12. @Override
    13. public double getResult() {
    14. double result = 0;
    15. result = super.get_numberA() * super.get_numberB();
    16. return result;
    17. }
    18. }

    除法类:

    1. /**
    2. * @author : [LiuYanQiang]
    3. * @version : [v1.0]
    4. * @className : OperationDiv
    5. * @description : [除法类]
    6. * @createTime : [2022/5/27 20:16]
    7. * @updateUser : [LiuYanQiang]
    8. * @updateTime : [2022/5/27 20:16]
    9. * @updateRemark : [描述说明本次修改内容]
    10. */
    11. public class OperationDiv extends Operation {
    12. @Override
    13. public double getResult() {
    14. double result = 0;
    15. if (super.get_numberB() == 0) {
    16. System.out.println("除数不能为0");
    17. } else {
    18. result = super.get_numberA() / super.get_numberB();
    19. }
    20. return result;
    21. }
    22. }

    简单工厂类:

    1. /**
    2. * @author : [LiuYanQiang]
    3. * @version : [v1.0]
    4. * @className : OperationFactory
    5. * @description : [简单工厂类]
    6. * @createTime : [2022/5/27 20:16]
    7. * @updateUser : [LiuYanQiang]
    8. * @updateTime : [2022/5/27 20:16]
    9. * @updateRemark : [描述说明本次修改内容]
    10. */
    11. public class OperationFactory {
    12. public static Operation createOperation(String operate) {
    13. Operation operation = null;
    14. switch (operate) {
    15. case "+":
    16. operation = new OperationAdd();
    17. break;
    18. case "-":
    19. operation = new OperationSub();
    20. break;
    21. case "*":
    22. operation = new OperationMul();
    23. break;
    24. case "/":
    25. operation = new OperationDiv();
    26. break;
    27. }
    28. return operation;
    29. }
    30. }

    客户端主方法类:

    1. /**
    2. * @author : [LiuYanQiang]
    3. * @version : [v1.0]
    4. * @className : Main
    5. * @description : [客户端]
    6. * @createTime : [2022/5/27 20:18]
    7. * @updateUser : [LiuYanQiang]
    8. * @updateTime : [2022/5/27 20:18]
    9. * @updateRemark : [描述说明本次修改内容]
    10. */
    11. public class Main {
    12. public static void main(String[] args) {
    13. Operation operation;
    14. operation=OperationFactory.createOperation("+");
    15. operation.set_numberA(1);
    16. operation.set_numberB(2);
    17. System.out.println(operation.getResult());
    18. }
    19. }

    多态理解

    同一操作,不同参数作用于不同的对象产生不同的结果。

     

    我们都知道封装是为了让类的调用者不需要知道类的实现细节,而多态能让类的调用者连这个类的类型是什么都不必知道,只需要知道这个对象具有某个方法即可。

    因此,多态可以理解成是封装的更进一步,让类调用者对类的使用成本进一步降低,提高程序的可扩充性、可维护性、可复用性。

  • 相关阅读:
    GUI自动化 - 操控键盘
    quartz框架(六)-ThreadPool
    【猿创征文】 Vue3 企业级优雅实战 - 组件库框架 - 2 初始化 workspace-root
    Windows 环境下的 Socket 编程 3 - 基于 TCP 的服务器/客户端
    隐私计算 FATE - 多分类神经网络算法测试
    百度Apollo成国内首家通过脱敏测试验证的Tier 1
    shell 同时执行多任务下载视频
    【Http】大文件传输 | 与tcp的关系
    【Vue 开发实战】基础篇 # 3:Vue组件的核心概念:事件
    plotly基础
  • 原文地址:https://blog.csdn.net/weixin_44684272/article/details/125011881