理解面向对象——多态

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

导语

什么是多态?我们先来看看百度百科给出的回答——在编程语言和类型论中,多态(英语: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”符号的判断就能实现乘法的扩展,但是这种解决方案还是违反了开闭原则,当然也有其他的解决办法来处理这个问题,可以使用工厂方法来解决,在这里就不过多赘述,主要是要讨论面向对象中多态的特性

目录
相关文章
|
5月前
|
存储 Java 编译器
初识面向对象(类和对象)
初识面向对象(类和对象)
46 0
|
2天前
|
存储 编译器 C++
C++类和对象的多态性
C++类和对象的多态性
7 0
C++类和对象的多态性
|
2天前
|
存储 C++
C++类与对象【多态】
C++类与对象【多态】
|
10月前
面向对象之多态2
面向对象之多态2
37 0
面向对象中的多态简单理解
面向对象中的多态简单理解
|
8月前
|
Java
Java面向对象之多态
Java面向对象之多态
40 0
|
9月前
|
存储 编译器 C++
C++ 面向对象三大特性——多态
面向对象三大特性的,封装,继承,多态,今天我们研究研究C++的多态。
|
9月前
|
算法 C++ 索引
c++学习之多态
c++学习之多态
42 0
|
10月前
|
设计模式 小程序
面向对象——多态
面向对象——多态
71 0