`

继承组合 转

阅读更多

 最近一个师弟问某实现是该用对象持有(其实就是组合)还是集成关系实现好。所以就在这里简单的浅谈一下,仅是个人观点,仅供参考。如果写的不对的地方请指出。

     首先它们都是实现系统功能重用,代码复用的最常用的有效的设计技巧,都是在设计模式中的基础结构。相信大家已了解的,类继承允许我们根据自己的实现来覆盖重写父类的实现细节,父类的实现对于子类是可见的,所以我们一般称之为白盒复用。对象持有(其实就是组合)要求建立一个号的接口,但是整体类和部分类之间不会去关心各自的实现细节,即它们之间的实现细节是不可见的,故成为黑盒复用。

     继承是在编译时刻静态定义的,即是静态复用,在编译后子类和父类的关系就已经确定了。而组合这是运用于复杂的设计,它们之间的关系是在运行时候才确定的,即在对对象没有创建运行前,整体类是不会知道自己将持有特定接口下的那个实现类。在扩展方面组合比集成更具有广泛性。

    继承中父类定义了子类的部分实现,而子类中又会重写这些实现,修改父类的实现,设计模式中认为这是一种破坏了父类的封装性的表现。这个结构导致结果是父类实现的任何变化,必然导致子类的改变。然而组合这不会出现这种现象。

    对象的组合还有一个优点就是有助于保持每个类被封装,并被集中在单个任务上(类设计的单一原则)。这样类的层次结构不会扩大,一般不会出现不可控的庞然大类。而累的继承就可能出来这些问题,所以一般编码规范都要求类的层次结构不要超过3层。组合是大型系统软件实现即插即用时的首选方式。

   在设计模式中这两个概念同时出现的地方就是Adapter模式:对象适配(组合)和类适配(继承)。一般我们提倡用对象适配而不是类适配。基于上面的原因。还有就是在我们的Java和.NET这些完全面向对象的语言而言类的继承是单继承,取消了C++等的多继承。下面放两个这两种方式的UML图:

类适配图:

 

    clip_image002

对象适配图:

clip_image002[9]

 

     最后还说一句,“优先使用对象组合,而不是继承”是面向对象设计的第二原则。但并不是说什么都设计都用组合,只是优先考虑组合,更不是说继承即使不好的设计,应该用组合,应为他们之间也有各自的优势。下面是他们之间的优缺点比比较表:

组 合 关 系

继 承 关 系

优点:不破坏封装,整体类与局部类之间松耦合,彼此相对独立

缺点:破坏封装,子类与父类之间紧密耦合,子类依赖于父类的实现,子类缺乏独立性

优点:具有较好的可扩展性

缺点:支持扩展,但是往往以增加系统结构的复杂度为代价

优点:支持动态组合。在运行时,整体对象可以选择不同类型的局部对象

缺点:不支持动态继承。在运行时,子类无法选择不同的父类

优点:整体类可以对局部类进行包装,封装局部类的接口,提供新的接口

缺点:子类不能改变父类的接口

缺点:整体类不能自动获得和局部类同样的接口

优点:子类能自动继承父类的接口

缺点:创建整体类的对象时,需要创建所有局部类的对象

优点:创建子类的对象时,无须创建父类的对象

<script src="http://www.google.com/jsapi" type="text/javascript"></script><script type="text/javascript"></script><script src="http://www.google.com/uds/?file=search&amp;v=1&amp;style=http%3A%2F%2Fwww.google.com%2Fcse%2Fstyle%2Flook%2Fshiny.css" type="text/javascript"></script><script src="http://www.google.com/uds/api/search/1.0/028fe26ec189eddd4b5bb8beab4baec4/default+en.I.js" type="text/javascript"></script>

分享到:
评论

相关推荐

    C++程序设计课件 ch11 继承与派生

    C++程序设计课件 第11章 继承与派生 11.1 继承与派生的概念 11.2 派生类的声明方式 11.3 派生类的构成 11.4 派生类成员的访问属性 11.5 派生类的构造函数和析构...11.8 继承与组合 11.9 继承在软件开发中的重要意义

    C#实现图形位置组合转换的方法

    主要介绍了C#实现图形位置组合转换的方法,涉及C#使用Matrix操作图形的相关技巧,需要的朋友可以参考下

    作为前端,你需要懂得javascript实现继承的方法

    现在我们可以利用ES6的extends方法实现继承,如果想了解更多有关ES6实现的继承请查看《ES6学习笔记(二):教你玩转类的继承和类的对象》,在这里不再做更多的介绍。 文章目录1. call()2. 借用构造函数继承父类型...

    mixins:C# Mixins - 创建一个由多个对象和_或属性组合而成的实例。 基本上是一个穷人的多重继承,旨在对象图的序列化和反序列化

    基本上是一个穷人的多重继承,旨在对象图的序列化和反序列化。 有关更多详细信息,请参阅 。 故事 作为Web API 开发人员 我想轻松创建复合对象 这样我就可以避免编写将多个对象映射/转换为一个的繁琐代码。 特别是...

    C++编程思想习题

    13.5组合与继承的选择 13.5.1子类型设置 13.5.2专门化 13.5.3私有继承 13.6保护 13.7多重继承 13.8渐增式开发 13.9向上映射 13.9.1为什么“向上映射” 13.9.2组合与继承 13.9.3指针和引用的向上映射 13.9.4危机 ...

    论文研究-基于育种算法的组合优化计算 .pdf

    基于育种算法的组合优化计算,许必熙,赵英凯,育种算法以适应度最大的个体为种子,通过随机的转基因操作繁殖下一代,新个体始终具有丰富的多样性,同时也能部分地继承种子的优

    设计模式详解

    设计模式详解

    写给大家看的面向对象编程书(第三版)

    第7章 掌握继承和组合 第8章 框架与重用:使用接口和抽象类实现设计 第9章 构建对象 第10章 用UML创建对象模型 第11章 对象和可移植数据:XML 第12章 持久对象:串行化和关系数据库 第13章 对象与因特网 第14...

    thinkinjava源码-Think-In-Java-Code:ThinkingInJava(第四版)书中源码以及课后练习代码

    结合使用组合和继承 7.4.1 确保正确清理 7.4.2 名称屏蔽 7.5 在组合与继承之间选择 7.6 protected关键字 7.7 向上转型 7.7.2 再论组合与继承 7.8 final关键字 7.8.1 final 数据 7.8.2 final 方法 7.8.3 final 类 7.9...

    重构-改善既有代码的设计+中文版

    Chapter 6:Composing Methods 组合方法   Extract Method 提取方法   Inline Method 内联方法   Inline Temp 内联临时变量   *Replace Temp with Query 用查询方法代替临时变量   Introduce Explaining ...

    C++面试题集锦1

    介绍一下C++里面的多态?用 C语言实现 C++的继承23继承机制中对象之间如何转换?指针和引用之间如何转换?组合与继承优缺点?左值右值26移动构造函数26C语

    PST部分传输序列法_OFDMPAPR_pts_matlab_

    PTS的基本思想是:将输入的OFDM符号X,分割成V个互不重叠的独立的子序列Xv,每个子块向量大小相等且子块中没有继承原符号相应位置的取值为0。经过N点快速傅里叶逆变换后获得时域信号xv,再与相位旋转因子系数bv相乘...

    Advanced.C++.Programming.Styles.and.Idioms (Advanced C++中文版)

    这些方法是围绕C++支持的抽象机制实施的:抽象数据类型,继承结构中的组合类型,面向对象程序设计以及多重继承。本书还展示了C++语言间接支持的核心习惯用法,诸如虚拟构造函数、原型对象以及高级垃圾收集技术。 ...

    .NET设计模式(15):结构型模式专题总结

    摘要:结构型模式,顾名思义讨论的是类和对象的结构,它采用继承机制来组合接口或实现(类结构型模式),或者通过组合一些对象,从而实现新的功能(对象结构型模式)。这些结构型模式,它们在某些方面具有很大的相似...

    java课程资源第六章

    复用类 组合、继承:语法、选择、使用 protected关键字 向上转型 Final关键字 初始化与类加载

    12种常用设计模式C#代码示例

    3、多用组合,少用继承。 4、为了交互对象之间的送耦合设计而努力。 5、类应该对扩展开发,对修改关闭。 6、依赖倒置原则:要依赖抽象,不要依赖具体类。 7、最少知识原则:只和你的密友谈话。 1,策略模式:定义...

    一个Go语言实现的Markdown转PDF命令行工具,基于headless chrome,简单、可靠、易安装、可定制化、易拓展

    它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go...

Global site tag (gtag.js) - Google Analytics