面向对象理解——多态

article/2025/9/18 12:10:13

何为多态

定义:

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

特点:

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

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

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

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

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

作用:

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

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

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

代码实现

运算类:

/*** @author : [LiuYanQiang]* @version : [v1.0]* @className : Operation* @description : [运算类]* @createTime : [2022/5/27 20:04]* @updateUser : [LiuYanQiang]* @updateTime : [2022/5/27 20:04]* @updateRemark : [描述说明本次修改内容]*/
public abstract class Operation {private double _numberA;private double _numberB;public double get_numberA() {return _numberA;}public void set_numberA(double _numberA) {this._numberA = _numberA;}public double get_numberB() {return _numberB;}public void set_numberB(double _numberB) {this._numberB = _numberB;}public abstract double getResult();
}

加法类:

/*** @author : [LiuYanQiang]* @version : [v1.0]* @className : OperationAdd* @description : [加法类]* @createTime : [2022/5/27 20:13]* @updateUser : [LiuYanQiang]* @updateTime : [2022/5/27 20:13]* @updateRemark : [描述说明本次修改内容]*/
public class OperationAdd extends Operation {@Overridepublic double getResult() {double result = 0;result = super.get_numberA() + super.get_numberB();return result;}
}

减法类:

/*** @author : [LiuYanQiang]* @version : [v1.0]* @className : OperationSub* @description : [减法类]* @createTime : [2022/5/27 20:13]* @updateUser : [LiuYanQiang]* @updateTime : [2022/5/27 20:13]* @updateRemark : [描述说明本次修改内容]*/
public class OperationSub extends Operation {@Overridepublic  double getResult() {double result = 0;result = super.get_numberA() - super.get_numberB();return result;}
}

乘法类:

/*** @author : [LiuYanQiang]* @version : [v1.0]* @className : OperationMul* @description : [乘法类]* @createTime : [2022/5/27 20:15]* @updateUser : [LiuYanQiang]* @updateTime : [2022/5/27 20:15]* @updateRemark : [描述说明本次修改内容]*/
public class OperationMul extends Operation {@Overridepublic double getResult() {double result = 0;result = super.get_numberA() * super.get_numberB();return result;}
}

除法类:

/*** @author : [LiuYanQiang]* @version : [v1.0]* @className : OperationDiv* @description : [除法类]* @createTime : [2022/5/27 20:16]* @updateUser : [LiuYanQiang]* @updateTime : [2022/5/27 20:16]* @updateRemark : [描述说明本次修改内容]*/
public class OperationDiv extends Operation {@Overridepublic double getResult() {double result = 0;if (super.get_numberB() == 0) {System.out.println("除数不能为0");} else {result = super.get_numberA() / super.get_numberB();}return result;}
}

简单工厂类:

/*** @author : [LiuYanQiang]* @version : [v1.0]* @className : OperationFactory* @description : [简单工厂类]* @createTime : [2022/5/27 20:16]* @updateUser : [LiuYanQiang]* @updateTime : [2022/5/27 20:16]* @updateRemark : [描述说明本次修改内容]*/
public class OperationFactory {public static Operation createOperation(String operate) {Operation operation = null;switch (operate) {case "+":operation = new OperationAdd();break;case "-":operation = new OperationSub();break;case "*":operation = new OperationMul();break;case "/":operation = new OperationDiv();break;}return operation;}
}

客户端主方法类:

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

多态理解

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

 

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

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


http://chatgpt.dhexx.cn/article/RUFhCZZS.shtml

相关文章

面向对象的理解及相关概念(封装,继承,多态)

前言 面向对象程序设计(OOP)是当今主流的程序设计范性,它取代了结构化或过程式编程技术。 一、面向对象是什么? 1、定义: 面向对象就是:把数据及对数据的操作方法放在一起,作为一个相互依存…

面向对象的理解

一、什么是面向对象? 对 Java 语言来说,一切皆是对象。把现实世界中的对象抽象地体现在编程世界中,一个对象代表了某个具体的操作。一个个对象最终组成了完整的程序设计,这些对象可以是独立存在的,也可以是从别的对象继…

面向对象理解

1.早期发展 面向对象(Object Oriented,OO)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法…

error: unknown file type '.pyx' (from 'pycocotools/_mask.pyx')

在 YOLO v3模型中运用 cocoapi 进行评估模型,安装时报错显示: building pycocotools._mask extension error: unknown file type .pyx (from pycocotools/_mask.pyx) make: *** [all] Error 1可能的解决方法:   运行的 Python 版本不对。 …

sklearn/tree/_criterion.pyx

注解: criterions分为几类,其中有classification criterions与regression criterions。classification criterions是针对离散的,regression criterions是针对连续分布的 本文主要讲解一下RegressionCriterion。 RegressionCriterion用于回归树(Regression Tree 回归树)中…

python中导入.pyx文件的问题解决

已经几次遇到这种问题了, 里面的region指的是一个.pyx文件。 ImportError: cannot import name region from toolkit.utils (D:\******\RPN\pysot-master\toolkit\utils\__init__.py) 解决方案: 创建一个setup.py文件,一般如果是搬运的话里面会有&…

将pyx文件编译成pyd文件(很多坑,已解决)

项目场景: Faster R-CNN项目,将pyx文件编译成pyd文件(很多坑,请注意) 项目环境 python 3.6 – conda的虚拟环境 TensorFlow 1.15.0 win 10 问题描述 使用网上的教程进行编译 有一个需要被编译的bbox.pyx文件,创建…

python文件中import pyx文件问题

1、首先,pyx文件需要安装Cython,这里先进入自己的虚拟环境,用conda安装Cython conda install Cython 2、需要用到pyx的地方是mattnet中的mask.py 文件,里面 import _mask.pyx 文件,需要先在mask的目录下建立setup文…

成功解决windows下将.pyx文件编译成.pyd文件

在linux上正常跑通的算法,搬到windows下使用就报错了 原来是其中涉及到.pyx文件的编译 在linux下.pyx会被编译成.so的文件,但是在windows下是无法使用.so文件的 需要重新编译成windows下的.pyd格式的才可以直接将python模块成功导入到算法中 所以需要解…

.pyx文件编译出错

文章目录 .pyx文件的编译导入 参考博客(写的超级好,完美解决了问题) 错误 ImportError: Building module dtw failed: ["distutils.errors.CompileError: command D:\\\\Program Files (x86)\\\\Microsoft Visual Studio\\\\2019\\\\Pr…

python导入pyx文件失败

报错如下: 出现无法导入的情况时,在import之前加上一下两条语句即可解决问题: import pyximport pyximport.install()

pyx 编译成 pyd

1、编写好py文件,然后将后缀改为pyx 2、编写好setup.py文件 3、在setup.py 文件同目录下打开命令行执行: python setup.py build_ext --inplace之后就会生成pyd文件 和C文件 示例: 需要编译成pyd的文件 fast_fib.pyx import functoolsdef …

如何在pycharm上编译使用pyx文件

前言 cython是专门用来写在Python里面import用的扩展库。实际上Cython的语法基本上跟Python一致,而Cython有专门的“编译器”先将 Cython代码转变成C,然后使用C编译器编译出最终的Python可调用的模块。 本人因在github中找到了一份用cython写的自定义库…

虚拟机的安装与ubuntu的创建,,Ubuntu快捷键

文章目录 vmware安装包与Ubuntu镜像文件:VMware的安装Ubuntu的创建Ubuntu快捷键 在学习与工作中,我们往往可能需要用到windows以外的操作系统,比如Linux系统就适合开发者的使用,往往用到虚拟机,这篇博客来讲讲VMware的…

Ubuntu操作-09 快捷键

文章目录 1 系统快捷键2 终端快捷键3 Gedit编辑器快捷键 Ubuntu快捷键介绍,已在Ubuntu21.10测试 1 系统快捷键 命令说明Ctrl Alt Fn1进入图形化用户登录界面Ctrl Alt Fn2进入当前图形化界面Ctrl Alt Fn3-Fn6进入命令行虚拟终端Ctrl Alt Fn7-Fn12进入另外的…

不可不知的ubuntu系统快捷键

软硬件环境 ubuntu 19.10 64bit Desktop 前言 ubuntu是当前最流行的linux发行版之一,使用ubuntu除了经常使用的Ctrlc (复制) 和Ctrlv (粘帖),其实还有一些不常用但却很有用的快捷键,熟练掌握常用快捷键绝对可以大大提升你的工作学习效率。文中…

ubuntu系统的快捷键,软件等配置

最近要完全使用ubuntu桌面系统了,很多在win 上的快捷键和软件都无法使用了,这里打算总结一下。 文章目录 1 常用快捷键2 常用配置调整左侧状态栏的顺序截图火狐禁止通知键盘快捷键设置DNS修改默认打开程序vs code 终端间距太大 3 常用软件安装meshlabana…

ubuntu的快捷键

1.一起按AltTab,在应用间顺向一览窗口,AltTabShift是逆向预览窗口。先打开终端,后打开文本编辑器,是下面这个样子。 一起按AltTab之后就会变成下面这样子 2.AltF2是打开命令窗口,可输入命令启动应用程序。一起按AltF2之后变成下面这样子,还可…

ubuntu系统快捷键

Ubuntu 16.04常用快捷键(转) 注意:在Linux下Win键就是Super键 启动器 Win(长按) 打开启动器,显示快捷键Win Tab 通过启动器切换应用程序Win 1到9 与点击启动器上的图标效果一样Win Shift 1到9 在应用中打开一个新窗口Win T 打…

Ubuntu快捷键、Ubuntu终端常用命令

Ubuntu快捷键、Ubuntu终端常用命令 作为一个window多年忠实粉,后来转去做自动驾驶不得已选用Ubuntu系统,系统需要劳烦同事帮忙装,装好后win10+ubuntu18.04双系统,开机登录ubuntu后一开始真的一脸蒙,啥都不…