文档章节

一段关于"多态"的沉思

猪刚烈
 猪刚烈
发布于 2014/10/12 11:47
字数 871
阅读 13
收藏 0
点赞 0
评论 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)!

© 著作权归作者所有

共有 人打赏支持
猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
关于设计模式的那些事情

在软件开发领域中,关于如何编写好可维护的程序一直是一个备受争议的话题,进而也提出了很多的编程理论,但是这样的编程理论的理论基础在哪儿,为什么编程这样的方法会比那样的方法要好,为什...

天蓬小猪 ⋅ 2014/06/28 ⋅ 1

C++ —面向对象之多态的实现与应用

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

Dawn_sf ⋅ 2017/04/05 ⋅ 0

浅谈闭包,原型链,面向对象

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

尚有 ⋅ 01/11 ⋅ 0

springMVC源码分析之拦截器

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

kim_o ⋅ 06/09 ⋅ 0

《Java编程思想》第四版读书笔记 第八章 多态

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

一万 ⋅ 2016/05/13 ⋅ 0

C++雾中风景4:多态引出的困惑,对象的拷贝?

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

LeeHappen ⋅ 2017/12/14 ⋅ 0

笨办法学C语言

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

小卒过河 ⋅ 2011/07/04 ⋅ 16

对Java多态的理解

Java中多态性的实现 什么是多态 面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。 多态的定义:指允...

wf王帆 ⋅ 2016/05/22 ⋅ 0

Java 复习 —— OOP

面向对象基本概念 1、面向对象(OOP、OOD)三大特点:封装、继承、多态。注意,抽象不是特点之一 2、面向对象编程是对数据进行抽象,而函数式编程是对行为进行抽象。现实世界中,数据和行为并...

learn_more ⋅ 2015/08/06 ⋅ 2

关于匿名内部类与回调函数

我们Android开发中经常用到一些匿名内部类,及其其中的回调函数,例如,我们给Button设置监听器时候通常要实现 OnCLickListener接口,并重写其中的Onclick()方法,这就是匿名内部类与回调函...

huaSolna ⋅ 2012/10/17 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

BS与CS的联系与区别【简】

C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、InFORMix或 SQL Server。客户端需要安装专用的客户端软件。 B/S是Brower/...

anlve ⋅ 44分钟前 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部