Java:深入理解“多态”(Polymorphic)和动态绑定(Dynamic Binding)

每篇一格言:

大音希声,大象无形。(至大的声音听起来却似没有声音,最大的形体,却反而没有形状。)

——《道德经·第四十一章》

1. 什么是多态

首先思考什么是编程?
程序的本质是按照既定规则接收指令并输出结果。
程序的规则映射的是现实世界。
现实世界是复杂的,因而程序也是复杂的。因此:

编程的本质是对复杂度的管理。

面对复杂问题,我们需要用抽象思维。就像开篇的格言将“有形”抽象为“无形”。“多态”正是基于抽象思维而设计的机制。即:

多态是同一个行为,可以有不同的表现形式或形态。

2. 为什么要设计多态

多态的核心思想

2.1 关注结果,而不是实现方式

中国有个谚语:“八仙过海,各显神通”。用程序语言描述就是,每一种行为,不同的对象可以有自己的实现方法。从调用者的角度看,对象的行为表现为接收指令的接口。
例如:
老师打开了暖气。
可用程序语言描述为:老师(对象)调用了暖气(对象)的制暖(接口)。
对于调用者老师来说,ta关注的是制暖的结果(房间温度上升),而不关心暖气如何运行。不管是电暖器还是对流暖气,老师都是调用同一种接口。

这里:
调用者(老师):处于外层
实现者(暖气):处于内层

关注结果,忽略实现方式的好处是外层设计不依赖内层实现,从而实现方式可以迭代而不影响调用接口。

2.2 统一指令,避免分类讨论

假设你是动物园管理员。
动物园里有各种动物,老虎,长颈鹿,猩猩,等等。
到了中午该让动物们吃饭了,于是你向工作人员传达了指令:

准备好食物,让老虎吃肉,长颈鹿吃树叶,猩猩吃蔬菜水果。。。。。。

你把每个动物提了一遍,可能还漏掉了新加入的。这个指令真是累赘。

于是,下一次你学聪明了,使用了“多态”传达如下指令:

准备好食物,让动物们进食。

至于吃什么?动物们和工作人员自己很清楚,不用你分类讨论了。
作为管理员和调度者,使用多态可以让指令简洁而统一。

3. 向下转型|向上转型

未完待续

发布了19 篇原创文章 · 获赞 8 · 访问量 2018

猜你喜欢

转载自blog.csdn.net/GentelmanTsao/article/details/104063812