父类对象应用于子类的特征就是多态,依然以图形类来说明多态,每个图形都拥有绘制自己的能力,这个能力可以看作是该类具有的行为,如果将子类的对象统一看作是超类的实例对象,这样当绘制任何图形时,可以简单地调用父类也就是图形类绘制图形的方法即可绘制任何图形。这就是多态最基本的思想。
多态性允许以统一的风格编写程序,以处理种类繁多的已存在的类以及相关类,这统一风格可以由父类来实现,根据父类统一风格的处理,就可以实例化子类的对象。由于整个事件的处理都只依赖于父类的方法,所以日后只要维护和调整父类的方法即可,这样降低了维护的难度和时间。
在提到多态的同时,不得不提到抽象类和接口,因为多态的实现并不依赖具体类,而是依赖于抽象类和接口。
再回到绘制图形的实例上来,作为所有图形的父类图形类,它具有绘制图形的能力,这个方法可以称为“绘制图形”,但如果要执行这个“绘制图形”的命令,没人知道应该画什么样的图形,并且如果要在图形类中抽象出一个图形对象,没有人能说清这个图形究竟是什么图形,所以使用“抽象”这个词汇来描述图形类比较恰当,在Java语言中称这样的类为抽象类,抽象类不能实例化对象。在多态的机制中,父类通常会被定义为抽象类,在抽象类中给出一个方法的标准,而不给出实现的具体流程,实质上这个方法也是抽象的。例如图形类中的“绘制图形”方法只提供一个可以绘制图形的标准,并没有提供具体绘制图形的流程,因为没有人知道究竟需要绘制什么形状的图形。
在多态的机制中,比抽象类更为方便的方式是将抽象类定义为接口,由抽象方法组成的集合就是接口。接口的概念在现实中也极为常见,比如笔者从不同的五金商店买来螺丝和螺丝钉,螺丝很轻松的就可以拧在螺丝钉上,可能螺丝和螺丝钉的厂家不同,但这两个物品可以很轻易的组合在一起,这是因为生产螺丝和螺丝钉的厂家都遵循着一个标准,这个标准在Java中就是接口,依然拿“绘制图形”来说明,可以将“绘制图形”作为一个接口的抽象方法,然后使图形类实现这个接口,同时实现“绘制图形”这个抽象方法,当三角形类需要绘制时,就可以继承图形类,重写其中“绘制图形”方法,改写这个方法为“绘制三角形”,这样就可以通过这个标准绘制不同的图形
|
|