文档章节

一段关于"多态"的沉思

猪刚烈
 猪刚烈
发布于 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
springMVC源码分析之拦截器

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

kim_o
06/09
0
0
《Java编程思想》第四版读书笔记 第八章 多态

面向对象的三个基本特征:数据抽象、继承和多态。多态的作用是消除类型之间的耦合关系。多态也被称作动态绑定、后期绑定或运行时绑定。 8.2 将一个方法调用同一个方法主体(我理解就是方法和...

一万
2016/05/13
163
0
C++雾中风景4:多态引出的困惑,对象的拷贝?

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

LeeHappen
2017/12/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

新工作与老项目

新的工作不知不觉的干了一个多月了。怎么说呢,跟想象中的差别不少,本来想的能进来跟大公司的同事能有很多交流,能在团队中跟大牛学习更快。结果公司的这个项目上只有两个程序员,项目是十年...

zypy333
9分钟前
0
0
mysql 在windows的安装

mysql 在windows的安装。 mysql64位的server的下载地址是: https://dev.mysql.com/downloads/mysql/ 使用的是5.7版本。 下载安装包,解压至D:\mysql\mysql-5.7.23-winx64\ 在D:\mysql\mysq...

lxzh504
21分钟前
1
0
云技术、大数据(hadoop)入门常见问题回答

当我们学习一门新技术的时候,我们总是产生各种各样的问题,这些问题整理出来,包括该 1.如何学习hadoop? 2.hadoop常见问题? 3.还有hbase、hive安装使用等? 你知道搭建hadoop平台需要些什...

董黎明
21分钟前
1
0
小程序自定义底部tab

场景 1.tabBar是在内页而非首页,这时就不得不自定义一个tabBar了 2.自定义风格 3.子页数量超过5个,得到更多了tab 4.改变点击tab默认事件,比如出登录界面,或者弹出上拉子菜单等 步骤 1.照...

萤火的萤火
27分钟前
1
0
shell炫技

1.为脚本添加“--help” #!/bin/shif [ ${#@} -ne 0 ] && [ "${@#"--help"}" = "" ]; then printf -- '...help...\n'; exit 0;fi; 2.输出字体添加颜色 https://misc.flogisoft.com......

HJCui
27分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部