理解面向对象——多态

举报
翟文彪 发表于 2022/05/29 05:12:00 2022/05/29
【摘要】 导语 什么是多态?我们先来看看百度百科给出的回答——在编程语言和类型论中,多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口。 多态类型(英语:polymorphic type)...

导语

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

简单工厂

什么是简单工厂?

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

构造运算器类

现在我们有一个运算器类,他有两个子类分别是加法类和减法类,以下使他们现在的类图:
在这里插入图片描述
以下是具体的代码实现:
运算类:

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();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

加法类:

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

减法类:

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

构造简单工厂类

我们在此基础之上加上简单工厂,由简单工厂来创建子类,类图变化为下图:
在这里插入图片描述
简单工厂代码:

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;
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

客户端实现

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);
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

分析

为什么要在讲解多态的时候引入简单工厂呢?首先是简单工厂的实现很好的体现了面向对象的多态特征。我们可以看到上面的简单工厂代码实现部分的第3行和第6行、第9行。这里就很好的体现了在导语中提到的子类的实现指向了父类的引用
在这里插入图片描述
而在这里使用的简单工厂也体现了多态的一个好处——可扩展性。如果此时,我想新增一个乘法类,那么我只需要新增一个单独的乘法类,并且在switch case中增减一个“x”符号的判断就能实现乘法的扩展,但是这种解决方案还是违反了开闭原则,当然也有其他的解决办法来处理这个问题,可以使用工厂方法来解决,在这里就不过多赘述,主要是要讨论面向对象中多态的特性

文章来源: blog.csdn.net,作者:翟文彪,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/zwb568/article/details/125004777

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。