理解面向对象——多态
导语
什么是多态?我们先来看看百度百科给出的回答——在编程语言和类型论中,多态(英语: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
- 点赞
- 收藏
- 关注作者
评论(0)