文档章节

一段关于"多态"的沉思

猪刚烈
 猪刚烈
发布于 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
海淀
程序员
浅谈闭包,原型链,面向对象

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

尚有
01/11
0
0
C++ —面向对象之多态的实现与应用

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

Dawn_sf
2017/04/05
0
0
springMVC源码分析之拦截器

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

kim_o
06/09
0
0
笨办法学C语言

继《笨办法学Python》之后,Zed Shaw开始动手写《笨办法学C语言》。 和《笨办法学Python》一样,这本C语言入门书也将采用习题方式引导读者学习。 在序言中,他引用了笛卡尔《第一哲学沉思录》...

小卒过河
2011/07/04
5.2K
16
《Java编程思想》第四版读书笔记 第八章 多态

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

一万
2016/05/13
163
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么 vue 默认导出的是 vue.common.js,它和 vue.js 的区别在哪里,又有什么关系?

这个问题在囧克斯的博客中有提到。 Vue 最早会打包生成三个文件,一个是 runtime only 的文件 vue.common.js,一个是 compiler only 的文件 compiler.js,一个是 runtime + compiler 的文件 ...

粒子数反转
29分钟前
3
0
php正则表达式替换图片地址

<?php /*PHP正则提取图片img标记中的任意属性*/ $str = '<center><img src="/uploads/images/20100516000.jpg" height="120" width="120"><br />PHP正则提取或更改图片img标记中的任意属性<......

mdoo
33分钟前
2
0
一个简单的系统监控脚本

一个简单的系统信息监控脚本 #!/bin/bash# DATE:20181018# System monitor by Kxvzinterval=5while :doecho '==========================================================...

Kxvz
36分钟前
2
0
七牛云助你度寒冬 | 每天 10:24, 新用户抢全额免单

近年来,中美贸易战、股市暴跌、房地产变天、人民币贬值等等,企业艰难生存于冰川夹缝之中,融资发展难上加难。 凛冬将至, 七牛云特此推出免单好礼,为新用户(2018 年 10 月 10 日后新注册...

七牛云
37分钟前
1
0
Echarts X轴刻度标签换行显示

xAxis: [ { 'type':'category', splitLine: {show: false}, axisLabel: { show: true,//是否显示 interval:0,//强制显示 ......

郭周园
42分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部