本节书摘来自异步社区出版社《C++面向对象高效编程(第2版)》一书中的第2章,第2.30节,作者: 【美】Kayshav Dattatri,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.30 has-a关系的重要性

C++面向对象高效编程(第2版)
“has-a”关系(也称为关联、聚集、包含、组合)是在OOD(面向对象设计)中频繁使用的重要关系。但是,许多设计者和程序员都没有很好地理解其相关性,从而导致复杂僵化的设计和不必要的继承。

在OOD阶段,软件的复用主要通过两种方式完成:继承和包含。它们各有优缺点。优秀的设计者了解它们的局限性、优点和代价,可以灵活自如地应用它们。继承将在第5章、第6章以及第二部分的第12章中详细讨论。

包含是一项强大的设计技术,它比继承更容易实现和管理。包含是对接口编程的真正应用。再回到Car包含Engine的例子,Car类对象对于它所包含的Engine类对象没有特权。Car类对象只通过它的接口操作(或使用)Engine类对象,绝对不会违反封装原则。进一步而言,Car中包含Engine类对象只是一个实现细节,Car的客户无需知道这些细节。Car抽象提供了一个定义良好的接口,Car的客户只需理解Car的接口和行为。Car的实现者也可以在运行期自由替换Engine类型(支持Engine的接口)的不同对象。例如,如果

图2-30

Car类对象持有一个Engine类对象的指针(或引用),在运行期,可能会用某些支持Engine接口的其他对象替换现有对象。这种改变不会影响Car的客户,因为改变的是内部的实现细节(详见第二部分第11章)。

利用聚集,可以用不同的对象组合出新的行为。我们可以通过改变内部实现对象,来为现有对象添加新的性能。这使得软件更加灵活,能适应不同的修改需要。

但是,“has-a”关系也有它们共同的缺点。当使用带有包含关系的对象时,由于额外的间接层次太多,导致运行期的效率太低。带有聚集关系的对象,其行为更加难以理解和描述,因为它们的行为在运行期很容易改变。要实现可靠的包含关系还要对资源管理特别留心(避免资源泄漏)。

总而言之,在设计抽象时,要特别注意类与类之间的关系。如果决定使用继承和包含关系,要额外小心。在学习完继承后,我们将在第6章末尾重新讨论这个问题。

阅读:

了解Smalltalk中的消息(方法)关系。

研究Eiffel中的接口与实现分离。

学习Modula-2中的模块(module)概念,并与对象作比较。

学习不同语言中的动态绑定(dynamic binding)和静态绑定(static binding)。

了解Ada中的程序包(package)概念。

理解Java中的类和接口模型。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

《C++面向对象高效编程(第2版)》——2.30 has-a关系的重要性相关推荐

  1. 《C++面向对象高效编程(第2版)》——3.11 类名、成员函数名、参数类型和文档...

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第3章,第3.11节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区 ...

  2. 《C++面向对象高效编程(第2版)》——2.29 泛化关系(is-a)

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第2章,第2.29节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区 ...

  3. 《C++面向对象高效编程(第2版)》——2.20 什么是多线程安全类

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第章,第2.20节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区& ...

  4. 《C++面向对象高效编程(第2版)》——导读

    前言 C++面向对象高效编程(第2版) 面向对象软件开发已逐渐成为开发软件的首选.优秀的面向对象软件开发人员.设计人员.系统架构师对其需求与日俱增.要想成为一名成功的面向对象编程(OOP)人员必须忘却 ...

  5. 《C++面向对象高效编程(第2版)》——3.13 采用语义

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第3章,第3.13节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区 ...

  6. 《C++面向对象高效编程(第2版)》——3.17 编写内存安全类

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第3章,第3.17节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区 ...

  7. 《C++面向对象高效编程(第2版)》——2.16 识别成员函数的目标对象

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第2章,第2.26节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区 ...

  8. 《C++面向对象高效编程(第2版)》——3.4 赋值操作符

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第3章,第3.4节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区& ...

  9. 《C++面向对象高效编程(第2版)》——3.16 从函数中返回引用

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第3章,第3.16节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区 ...

最新文章

  1. golang go build 报错 import cycle not allowed
  2. 如何删除VS2015中的OpenCV的配置
  3. 移动端利用-webkit-box水平垂直居中
  4. LeetCode Search in Rotated Sorted Array II -- 有重复的旋转序列搜索
  5. 如何保证电子邮件的安全
  6. git add后取消_Python 命令行之旅:使用 click 实现 git 命令
  7. maya材质sheen_maya怎样做耐磨金属质感?
  8. 从实践的角度来回顾一下SQL注入
  9. 数值分析(第五版) 第一章知识点总结
  10. javascript获取窗口位置、绝对位置、事件位置等
  11. 海滨学院计算机基础知识,北京交通大学海滨学院计算机基础考试卷-网络应用基础...
  12. 计算机信息安全专业代码0839,全国网络空间安全学科专业分布
  13. shader函数整理
  14. 配置Linux服务器防火墙端口规则
  15. 【JS】每日一题:模块化
  16. PTA甲 1069~1072题解
  17. PS|你真的了解PS吗?
  18. 无穷小微积分词汇索引怎么使用?
  19. LeetCode 2312. 卖木头块
  20. Ubuntu下常用的快捷键

热门文章

  1. 十种方法保持云中数据安全
  2. Action 相关组件
  3. 开题:在移动开发中使用JavaScript进行混合编程提高代码复用率
  4. vscode snippet利器
  5. JavaScript中typeof的用法
  6. Android第四十一天(3)
  7. 怎么修改Outlook2010 PST数据文件位置(默认邮件存储目录)
  8. mysql主从(GTID复制模式)
  9. 主流浏览器新版本将不再支持TLS 1.0/1.1
  10. 基于HttpClient的HttpUtils(后台访问URL)