文档章节

一段关于"多态"的沉思

猪刚烈
 猪刚烈
发布于 2014/10/12 11:47
字数 871
阅读 13
收藏 0

本文原文连接:http://blog.csdn.net/bluishglc/article/details/12652379  转载请注明出处!


如果你是一个有着深刻OO背景的程序员,你必定已经习惯于使用OO的思维进行分析和建模,从领域问题中去抽象概念,形成你的“对象”。如果业务系统中有一组相似却彼此存在差异的概念,你抽象出的往往是一个类族(Class Hierarchy) 。如果它们共同具有的业务方法因各自的特点而在处理行为上表现出差异,那此时就是展现"多态"魅力的最佳时机.


"多态"是实现"基于抽象编程"的重要保障机制,它让程序远离了大量令人懊恼的if...else...,使代码变得优雅简洁,在引入新的类型时也不需要对现有类型做任何修改(保证了"开闭原则"),种种这些好处确实让人激动!但是如果你仔细回顾那些自己曾经所设计过的类族,可能是你没有意识到,可能你也曾经困惑过,那就是在你四处自由而愉快地使用着你的接口或是抽象基类写程序而不必在乎当下是哪个具体类的时候,在你程序的某个地方,你却无论如何也不能直接使用你的那个接口或是抽象基类了,在那个点上,原本看似完美的类族被彻底地“打回了原形”,因为你意识到你将不得不一一判断当前对象是哪一种具体类了。可能你会不甘心,用怀疑的眼光重新审视你的类族, 尝试找出设计上的失误,让这最后一处"异类"能纳入"大同",然而几经改动,最初的方案可能都已经被过度设计了,而你还是没有找到解决方法,于是你无可奈何,最后还是老老实实地使用了一连串的if...else...


是什么原因导致了这种情况的发生?是设计上的瑕疵还是“多态”天生的缺陷?回到那个让你头疼的“点”上,看看你的代码正在做什么?是不是正在从外部输入:一个UI,一个命令行,或是数据库中构建你的类族?或是反过来正将你的类族展示到UI、命令行或是持久化到数据库中?或者更为抽象但准确地说,你正在试图将一个结点“类型化”的“树”状数据结构向结点“无类型区分”的“扁平”数据结构进行转化(或反过来),以达到展示或是储存的目的?如果是这样,那就不用再纠结,这个“点”是你不可能规避的,你实际上正处在一个从OO模型向非OO模型(或反之)转化的"边界"上,在非OO模型那一则,没有叫"多态"的东西,所以,按照每个对象的具体类型,通过一连串的if...else...去完成这种转化是正常且不可避免的。


如果你能再深入地思考下去,你会找到这个问题最底层的原因,这个原因深刻但足以让你信服而不再纠缠这个问题,这个原因就是OO中的那个“老问题”:阻抗失配(Impedance Mismatch)!

本文转载自:http://blog.csdn.net/bluishglc/article/details/12652379

共有 人打赏支持
猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
私信 提问
C++ —面向对象之多态的实现与应用

多态 大家应该都听过C++三大特性之一多态,那么什么多态呢?多态有什么用?通俗一点来讲-> 多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程...

Dawn_sf
2017/04/05
0
0
浅谈闭包,原型链,面向对象

闭包: 百度百科: 官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。 闭包的特点:   1.作为一个函数变量的一...

尚有
01/11
0
0
去除IF语句

if语句是一个很古老的东西,对我而言,我最早学习的BASIC语言中,就有他的面孔。我相信,任何一门高级语言中一定都会有if语句的存在。当然,它也是一种简单的逻辑结构,非常容易掌握,哪怕对...

崔钢
2011/07/14
910
12
C++雾中风景4:多态引出的困惑,对象的拷贝?

C++作为一门面向对象的语言,自然具备了面向对象的三大特征:封装,继承,多态。在学习多态性质的过程中,发现了C++与其他语言很大的区别(坑?)。在C++中的=操作符的使用与C++呈现的内存模...

LeeHappen
2017/12/14
0
0
springMVC源码分析之拦截器

 一个东西用久了,自然就会从仅使用的层面上升到探究其原理的层面,在javaweb中springmvc更是如此,越是优秀的框架,其底层实现代码更是复杂,而在我看来,一个优秀程序猿就相当于一名武林高...

kim_o
06/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在Chrome浏览器中启动deviceready事件(尝试调试phonegap项目)?

我正在开发PhoneGap应用程序,我希望能够在Chrome中调试它,而不是在电话上调试。但是,我在onGetReady()函数中初始化我的代码,该函数在PhoneGap触发“deviceready”事件时触发。由于Chr...

kisshua
20分钟前
1
0
支付宝客户端架构分析:自动化日志收集及分析

摘要: 《支付宝客户端架构解析》系列将从支付宝客户端的架构设计方案入手,带领大家进一步了解支付宝在客户端架构上的迭代与优化历程。 小蚂蚁说: 《支付宝客户端架构解析》系列将从支付宝...

阿里云官方博客
23分钟前
1
0
nginx中部署vue打包后的静态文件

如何在nginx中部署静态资源就不描述了, 请看我的这篇博客 将vue脚手架项目打包后的静态文件放到nginx上, 发现有个问题, 即url上有#, 怎么去掉这个#呢. 1 项目中router的mode 路由的mode要为h...

克虏伯
41分钟前
7
0
JS容易理解错误的地方

在这端代码执行的末尾,你会不会hi变量回事函数中的hi了?你会不会认为这不是按引用传递了? 对值传递和引用传递产生质疑了? 1 var hi = {};2 function sayHello(hi) { ...

器石_
42分钟前
4
0
Java开发学习--MongoDB

之前只学过sql,第一次使用非关系型数据库。以前对于关系型数据库与非关系型数据库的概念很模糊,通过这次的学习对这两者有了一个清晰的概念。 主键 在MongoDB中,主键名叫"_id",如果在生成...

微笑向暖wx
46分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部