理解面向对象——多态

导语

什么是多态?我们先来看看百度百科给出的回答——在编程语言和类型论中,多态(英语: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();
}

加法类:

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”符号的判断就能实现乘法的扩展,但是这种解决方案还是违反了开闭原则,当然也有其他的解决办法来处理这个问题,可以使用工厂方法来解决,在这里就不过多赘述,主要是要讨论面向对象中多态的特性

猜你喜欢

转载自blog.csdn.net/zwb568/article/details/125004777