• 面向对象理解——多态


    何为多态

    定义:

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

    特点:

    (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. }

    多态理解

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

     

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

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

  • 相关阅读:
    Object.defineProperty用法
    算法训练(leetcode)第二十八天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
    go 线程限制数量v2 --chatGPT
    案例分享 | 金融行业运维数字化转型路径探索与实践
    软件测试的学习笔记(5)
    Qgis根据区域划分点、线面
    Shiro讲解(基于Springboot搭建)
    安装教程之Windows 11安装Linux子系统并运行Linux GUI应用
    基于JAVA的门禁管理系统【附源码】
    力扣(LeetCode)565. 数组嵌套(C++)
  • 原文地址:https://blog.csdn.net/weixin_44684272/article/details/125011881