文档章节

优先使用对象组合,而不是类继承

j
 jims
发布于 2016/11/13 20:35
字数 1045
阅读 78
收藏 0

极限编程》(Extreme programming)的指导原则之一是“只要能用,就做最简单的”。一个似乎需要继承的设计常常能够戏剧性地使用组合来代替而大简化,从而使其更加灵活。因此,在考虑一个设计时,问问自己:“使用组合是不是更简单?这里真的需要继承吗?它能带来什么好处?”

继承和组合的比较:

  面向对象系统中功能复用的两种最常用技术是类继承和对象组合(object composition)。正如我们已解释过的,类继承允许你根据其他类的实现来定义一个类的实现。这种通过生成子类的复用通常被称为白箱复用(white-box reuse)。术语“白箱”是相对可视性而言:在继承方式中,父类的内部细节对子类可见。

  对象组合是类继承之外的另一种复用选择。新的更复杂的功能可以通过组装或组合对象来获得。对象组合要求被组合的对象具有良好定义的接口。这种复用风格被称为黑箱复用(black-box reuse),因为对象的内部细节是不可见的。对象只以“黑箱”的形式出现。

        继承和组合各有优缺点。类继承是在编译时刻静态定义的,且可直接使用,因为程序设计语言直接支持类继承。类继承可以较方便地改变被复用的实现。当一个子类重定义一些而不是全部操作时,它也能影响它所继承的操作,只要在这些操作中调用了被重定义的操作。

        但是类继承也有一些不足之处。首先,因为继承在编译时刻就定义了,所以无法在运行时刻改变从父类继承的实现。更糟的是,父类通常至少定义了部分子类的具体表示。因为继承对子类揭示了其父类的实现细节,所以继承常被认为“破坏了封装性” 。子类中的实现与它的父类有如此紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当你需要复用子类时,实现上的依赖性就会产生一些问题。如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。一个可用的解决方法就是只继承抽象类,因为抽象类通常提供较少的实现。

        对象组合是通过获得对其他对象的引用而在运行时刻动态定义的。组合要求对象遵守彼此的接口约定,进而要求更仔细地定义接口,而这些接口并不妨碍你将一个对象和其他对象一起使用。这还会产生良好的结果:因为对象只能通过接口访问,所以我们并不破坏封装性;只要类型一致,运行时刻还可以用一个对象来替代另一个对象;更进一步,因为对象的实现是基于接口写的,所以实现上存在较少的依赖关系。

  对象组合对系统设计还有另一个作用,即优先使用对象组合有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。另一方面,基于对象组合的设计会有更多的对象 (而有较少的类),且系统的行为将依赖于对象间的关系而不是被定义在某个类中。

  这导出了我们的面向对象设计的第二个原则:优先使用对象组合,而不是类继承。

本文转载自:http://www.cnblogs.com/nexiyi/archive/2013/06/16/3138568.html

共有 人打赏支持
j
粉丝 4
博文 172
码字总数 30033
作品 0
合肥
私信 提问
java中类与类之间的关系讲解

有人学了继承,认为他是面向对象特点之一,就在所有能用到继承的地方使用继承,而不考虑究竟该不该使用,无疑,这是错误的。那么,究竟该如何使用继承呢? java中类与类之间的关系 大部分的初...

菜鸟零号 kungfu~peng
2017/12/20
0
0
Boolan微专业:C++第十一周学习笔记

本周开始设计模式内容的学习。 C++设计模式学习笔记大纲 何谓设计模式? 每一个模式描述了一个在我们周围不断重复发生的问题以及该问题的解决方案的核心。 在程序设计中,我们面对的挑战是“...

逗之煞
2018/01/01
0
0
JAVA程序员应该了解的10个面向对象设计原则

原则1:DRY(Don't repeat yourself) 即不要写重复的代码,而是用“abstraction”类来抽象公有的东西。如果你需要多次用到一个硬编码值,那么可以设为公共常量;如果你要在两个以上的地方使...

吴远盈
2012/05/17
0
0
[译] 函数式 Mixin(软件编写)(第七部分)

原文地址:Functional Mixins 原文作者:本文已获原作者 Eric Elliott 授权 译文出自:掘金翻译计划 译者:yoyoyohamapi 校对者:Tina92 reid3290 Smoke Art Cubes to Smoke — MattysFli...

吴晓军
2017/06/21
0
0
设计模式学习(一):从设计原则到设计模式

说明:这些资料仅仅是对设计模式的一些总结,没有设计模式的相关知识,很难看懂。即使看懂了这些,也仅说明理解了模式的基本思想。想要学好设计模式,还是建议好好看文后所列的参考书籍和推荐...

技术小美
2017/11/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一枚戒指,一场仪式,这件事阿里巴巴坚持了15年

为入职满五年的员工举行盛大仪式,为他们每个人戴上私人订制的戒指,是阿里巴巴坚持了15年“五年陈”的传统。1月22日,阿里集团为最新一季的“五年陈”们举行了授戒仪式。 2018五年陈小档案 ...

阿里云官方博客
22分钟前
0
0
前后端常见的几种鉴权方式

什么是鉴权 鉴权是指验证用户访问系统的权力 常用的鉴权有四种: HTTP Basic Authentication session-cookie Token 验证 OAuth(开放授权) HTTP Basic Authentication 这种授权方式是浏览器遵...

小草先森
24分钟前
2
0
Spring Cloud 微服务搭建注意的几个点

参考教程 https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f1-eureka/ 1)@EnableEurekaServer 引入标红,引入失败 ; @EnableEurekaClient 亦同 其中会出现 @EnableEurekaServer 引入......

阿白
30分钟前
2
0
PyCharm入门教程——在编辑器中打开和重新打开文件

PyCharm最新版本下载 JetBrains PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外,该IDE提供了一些高级功能,以用于Django框架下的专业Web...

电池盒
33分钟前
1
0
数据生产与收集

数据 对于移动端的app来说, 分析的数据大致上都可以分为俩种, 一种是在线数据,一种是离线数据。 在线数据, 即app后端服务所产生的日志数据,例如服务接口的性能数据, 服务接口的调用及其...

hblt-j
41分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部