代码学习-多态
什么是多态
“指为不同数据类型的实体提供统一的接口。”这是在百度百科上面看到的内容。
通过在现实生活中的理解就是同样的一个命令,在不同的人身上体现出不同的结果,举个例子就是去上学这件事情在不同年龄段的人体现出来的就不一样,3-6岁的孩子要去幼儿园,6-12岁的孩子要去小学,13-16-就是中学,以此类推,这就是在现实生活中的多态,那么在代码中我们可以看看是什么样子的。
多态在代码中的体现
这里代码我们以大话设计模式的简单工厂为例,这里以它为例是因为入门简单好理解。而且多态的体现更加突出。
首先这里是一个运算的父类
//运算类 public class Operation{ private double _numberA=0; private double _numberB=0; public double GetNumberA(){ return _numberA; } public void SetNumberA(double NumberA){ _numberA=NumberA; } public double GetNumberB(){ return _numberB; } public void SetNumberA(double NumberB){ _numberA=NumberB; } public double GetResult(){ double result=0; return result; } }
下面这两个是运算子类,他们都继承了运算父类,别切都重写的GetResult()这个方法。
//加法类 public class OperationAdd extends Operation{ @override public double GetResult(){ return super.GetNumberA()+super.GetNumberB(); } } //减法类 public class OperationSub extends Operation{ @override public double GetResult(){ return super.GetNumberA()-super.GetNumberB(); } }
然后这是我们的简单工厂类,上面的几个都是我们正常的继承与重写这些操作,那么下面这里的工厂类就做了一个重大的变化,可以看到createOperate()这个方法返回值类型是一个运算类的类型,而且在这个方法中可以看到有一个Operation类型的引用和一个switch case的选择语句,在这个选择分支中可以看到我们这个oper引用指向了子类的对象,那么当父类的引用指向了子类的对象也就意味着现在的这个对象使用的方法将会是子类的方法。
//简单工厂类 public class OperationFactory{ public static Operation createOperate(String operate){ Operation oper=null; switch (operate){ case "+" oper=new OperationAdd(); break; case"-" oper=new OperationSub(); break; } return oper; } }
上面说到了父类在指向子类的对象时可以使用子类的方法, 那么在客户端这里就体现出来了,我们在使用createOperate()这个方法传入的参数就是"+",那么此时的oper这对象是一个加法类型的子类对象,那此时使用的GetResult()方法就是一个进行加法计算得到的结果,如果我在createOperate()这个方法中传入的是“-“,那么这个对象就是一个减法类型的子类对象。同理那么这个GetResult()这个方法就是进行减法运算的。
这就是在代码中体现出来的多态,需要的是通过父类的引用指向子类的实现,这就是设计原则中的里氏替换。这在外界看来就是一个operation类进行的同一个操作,但是操作的结果不同。
//客户端类 public class client{ public static void main(String[] args){ Operation oper; oper=OperationFactory.createOperate("+"); oper.setNumberA(8); oper.setNumberB(9); double result= oper.GetResult(); System.out.println(result); } }
多态的重点是什么
通过上面的描述我们可以看到,有了多态我们可以应对不同的情况,而且只需要继承父类进行重写,那么对应的就是为了更好的扩充,有了多态就增加了可扩充的空间。所以多态是为了可扩充,而对应的继承是为了更好的复用。这也是面向对象三大特征体现出来的不同侧重点。