理解面向对象——多态

简介: 理解面向对象——多态

导语

什么是多态?我们先来看看百度百科给出的回答——在编程语言和类型论中,多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口。 多态类型(英语:polymorphic type)可以将自身所支持的操作套用到其它类型的值上。而我理解的多态其实究其根本就只有一句话就是——子类的实现指向父类的引用。下面我们通过实例来学习了解一下面向对象中的多态。


简单工厂

什么是简单工厂?

我们将实例化子类的过程交由一个单独的类来去创造实例,这个单独的类就是我们说的工厂。所有的实例化字类的过程都交由工厂去做,而不是在客户端去做。


构造运算器类

现在我们有一个运算器类,他有两个子类分别是加法类和减法类,以下使他们现在的类图:

e143c2c0b8c54e3588f887488516ada8.png

以下是具体的代码实现:

运算类:

public class Operation{
  private double numberA = 0;
  private double numberB = 0;
  public double getNumberA() {
        return numberA;
    }
    public void setNumberA(double numberA) {
        this.numberA = numberA;
    }
    public double getNumberB() {
        return numberB;
    }
    public void setNumberB(double numberB) {
        this.numberB = numberB;
    }
    // 获取结构的抽象方法
    public abstract double GetResult();
}

加法类:

public class OperationAdd extends Operation{
    @Override
    public double GetResult() {
        double result = 0;
        result = super.getNumberA() + super.getNumberB();
        return result;
    }
}

减法类:

public class OperationSub extends Operation{
    @Override
    public double GetResult() {
        double result = 0;
        result = getNumberA() - getNumberB();
        return result;
    }
}

构造简单工厂类

我们在此基础之上加上简单工厂,由简单工厂来创建子类,类图变化为下图:

简单工厂代码:

public class OperationFactory {
    public static Operation createOperate(String operate) {
        Operation opera = null;
        switch (operate) {
            case "+":
                opera = new OperationAdd();
                break;
            case "-":
                opera = new OperationSub();
                break;
        }
        return opera;
    }
}

客户端实现

public class Client {
    public static void main(String[] args) {
        Operation opera;
        opera = OperationFactory.createOperate("+");
        opera.setNumberA(1);
        opera.setNumberB(2);
        double result = opera.GetResult();
        System.out.println(result);
    }
}

分析

为什么要在讲解多态的时候引入简单工厂呢?首先是简单工厂的实现很好的体现了面向对象的多态特征。我们可以看到上面的简单工厂代码实现部分的第3行和第6行、第9行。这里就很好的体现了在导语中提到的子类的实现指向了父类的引用

而在这里使用的简单工厂也体现了多态的一个好处——可扩展性。如果此时,我想新增一个乘法类,那么我只需要新增一个单独的乘法类,并且在switch case中增减一个“x”符号的判断就能实现乘法的扩展,但是这种解决方案还是违反了开闭原则,当然也有其他的解决办法来处理这个问题,可以使用工厂方法来解决,在这里就不过多赘述,主要是要讨论面向对象中多态的特性

目录
相关文章
|
运维 Serverless API
函数计算FC报错问题之报错{"detail":"Not Found"}如何解决
函数计算(Function Compute,FC)是一个事件驱动的全托管计算服务,允许用户编写并上传代码,而无需管理服务器运行和维护;在使用过程中,可能会遇到各种报错,本合集聚焦于函数计算FC常见的报错问题,提供一系列的故障排查指导和解决建议,帮助用户优化云端函数执行
897 0
|
人工智能 自然语言处理 文字识别
阿里推出AnyText: 解决AI绘图不会写字的问题,可以任意指定文字位置,且支持多国语言!
【2月更文挑战第17天】阿里推出AnyText: 解决AI绘图不会写字的问题,可以任意指定文字位置,且支持多国语言!
896 2
阿里推出AnyText: 解决AI绘图不会写字的问题,可以任意指定文字位置,且支持多国语言!
|
数据采集 数据挖掘 大数据
数据处理利器:使用Pandas进行数据清洗与转换
【4月更文挑战第12天】在大数据时代,Pandas是Python数据分析的关键工具,提供高效的数据清洗和转换功能。本文介绍了如何使用Pandas处理缺失值(删除或填充)、异常值(Z-Score法和IQR法)以及重复值(检测和删除)。此外,还涵盖了数据转换,包括数据类型转换、数据标准化(Min-Max和Z-Score)以及类别数据的one-hot编码。通过学习这些方法,可以为数据分析和挖掘奠定坚实基础。
418 0
|
存储 自然语言处理 数据可视化
基于词云图+Kmeans聚类+LDA主题分析+社会网络语义分析对大唐不夜城用户评论进行分析(上)
基于词云图+Kmeans聚类+LDA主题分析+社会网络语义分析对大唐不夜城用户评论进行分析
410 0
|
SQL 数据库
Microsoft SQL Server 2014如何来备份数据库
Microsoft SQL Server 2014如何来备份数据库
1230 3
|
监控 Java 调度
阿里云 ARMS 应用监控重磅支持 Java 21
阿里云 ARMS 应用监控重磅支持 Java 21
48769 126
|
Shell C++ Python
VScode 右键菜单加入使用用VSCode打开文件和文件夹【Windows】
鼠标右击文件或者文件夹,可直接用VSCode打开,非常方便。但如果我们在安装VSCode的时候没有勾选这2个选项,那就享受不到这个便捷的功能了,那么怎么办呢?此时存在2种方法进行修复:重装软件在安装的过程中勾选上这2个选项即可(肯定我们不愿意,很多配置和插件都用习惯了,再装很费事,即使是 setting sync 也免不了麻烦,尤其是配置了python或C/C++的开发环境,所以这个我们不推荐)安装勾选修改注册表右键打开文件右键打开文件夹。
2246 0
|
JSON 算法 API
【python】python指南(十三):FastAPI鉴权Authorization方法
【python】python指南(十三):FastAPI鉴权Authorization方法
876 0
|
存储 NoSQL MongoDB
深入解析 MongoDB 与 Python:基本语法、实用示例与最佳实践
深入解析 MongoDB 与 Python:基本语法、实用示例与最佳实践
271 0
|
机器学习/深度学习 PyTorch 算法框架/工具
详解Batch Normalization并基于PyTorch实操(附代码)
详解Batch Normalization并基于PyTorch实操(附代码)
462 2