1. //############################################################################
  2. /*
  3. * 代码复用: 继承 vs 组合
  4. */
  5. //继承实现代码复用
  6. class BaseDog {
  7. ...
  8. ... // 公共的操作
  9. };
  10. class BullDog : public BaseDog {
  11. ... // 调用公共操作,执行更多任务
  12. };
  13. class ShepherdDog : public BaseDog {
  14. ... // 调用公共操作,执行更多任务
  15. };
  16. // 组合实现代码复用
  17. class ActivityManager {
  18. ... // 公共操作
  19. };
  20. class Dog {
  21. ...
  22. };
  23. class BullDog : public Dog {
  24. ActivityManager* pActMngr;
  25. ... // 通过pActMngr调用公共操作
  26. };
  27. class ShepherdDog : public Dog {
  28. ActivityManager* pActMngr;
  29. ... // 通过pActMngr调用公共操作
  30. };
  31. /*
  32. * 代码复用: 组合优于继承
  33. *
  34. * 1. 复用者和被复用者之间具有更少的代码耦合
  35. * a. 子类自动继承父类所有的公有成员
  36. * b. 子类可以访问父类的保护成员
  37. * - 继承破坏了封装性
  38. */
  39. /*
  40. * 2. 动态绑定
  41. * a. 继承在编译时绑定
  42. * b. 组合可以在编译时绑定,也可以在运行时绑定
  43. */
  44. class OutdoorActivityManager : public ActivityManager {...}
  45. class IndoorActivityManager : public ActivityManager {...}
  46. /*
  47. * 3. 灵活的代码结构
  48. *
  49. * Dog ActivityManager
  50. *
  51. * BullDog OutdoorActivityManager
  52. * ShepherdDog IndoorActivityManager
  53. * ... ...
  54. */
  55. // 组合的例子:只从纯虚类继承
  56. class ActivityManager {
  57. void eatBiscuit() { ... }
  58. };
  59. class Dog {
  60. ...
  61. virtual void eatBiscuit() = 0;
  62. };
  63. class BullDog : public Dog {
  64. ActivityManager* pActMngr;
  65. ...
  66. void eatBiscuit() { pActMngr->eatBiscuit(); }
  67. };
  68. class ShepherdDog : public Dog {
  69. ActivityManager* pActMngr;
  70. ...
  71. void eatBiscuit() { pActMngr->eatBiscuit(); }
  72. };

C++进阶--代码复用 继承vs组合的更多相关文章

  1. Go语言中的代码重用 - 继承还是组合?

    故事要从我在一个项目中,想要假装的专业一点而遇到的一个陷阱说起. 代码重用 在这个项目中,我们已经有了类似如下的代码: package main import ( "fmt" ) ...

  2. javascript代码复用--继承

    由于javascript没有类的概念,因此无法通过接口继承,只能通过实现继承.实现继承是继承实际的方法,javascript中主要是依靠原型链要实现. 原型链继承 原型链继承是基本的继承模式,其本质是 ...

  3. java代码复用(继承,组合以及代理)

    作为一门面向对象开发的语言,代码复用是java引人注意的功能之一.java代码的复用有继承,组合以及代理三种具体的表现形式,下面一一道来. 第一种方式是通过按照现有的类的类型创建新类的方式实现代码的复 ...

  4. Rust 中的继承与代码复用

    在学习Rust过程中突然想到怎么实现继承,特别是用于代码复用的继承,于是在网上查了查,发现不是那么简单的. C++的继承 首先看看c++中是如何做的. 例如要做一个场景结点的Node类和一个Sprit ...

  5. Java代码复用的三种常用方式:继承、组合和代理

    复用代码是Java众多引人注目的功能之一.这句话很通顺,没什么问题,但问题在于很多人并不清楚“复用”是什么.就好像我说“沉默王二是一个不止会写代码的程序员”,唉,沉默王二是谁? 我们需要来给“复用”下 ...

  6. Java——代码复用(组合和继承)

    前言 "复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它必须还能够做更多的事情." Java解决问题都围绕类展开的, ...

  7. PHP代码的多继承 -》 PHP代码复用新的姿势 trait

    本文参考:  http://php.net/language.oop5.traits 一.什么是trait 从PHP 5.4.0 开始 PHP 实现了一种新的代码复用方式 trait. 二.trait ...

  8. Atitit 代码复用的理解attilax总结

    Atitit 代码复用的理解attilax总结 1.1. 继承1 1.1.1. 模式1:原型继承1 1.1.2. 模式2:复制所有属性进行继承 拷贝继承1 1.1.3. 模式3:混合(mix-in)1 ...

  9. javascript 模式(1)——代码复用

    程序的开发离不开代码的复用,通过代码复用可以减少开发和维护成本,在谈及代码复用的时候,会首先想到继承性,但继承并不是解决代码复用的唯一方式,还有其他的复用模式比如对象组合.本节将会讲解多种继承模式以实 ...

随机推荐

  1. 【02_258】Add Digits

    Add Digits Total Accepted: 49702 Total Submissions: 104483 Difficulty: Easy Given a non-negative int ...

  2. J - FatMouse's Speed

    p的思路不一定要到最后去找到ans:也可以设置成在中间找到ans:比如J - FatMouse's Speed 这个题,如果要是让dp[n]成为最终答案的话,即到了i,最差的情况也是dp[i-1],就 ...

  3. fixed不能罩住下面的内容

    fix的优先级并不是最高的,所以要设置z-index,比它下面的元素高就能遮住了

  4. opencv中mat类介绍

    The class Mat represents an n-dimensional dense numerical single-channel or multi-channel array. It ...

  5. (9)模板层 - templates(模板语言、语法、取值、过滤器、变量的使用)

    django的模板语言:DTL 模板语言的变量传入 这个是标签 {{ 变量名 }} {{ 变量名 }}   #模板语言的替换可以在模板中的任意位置生效 PS:通过 . 可以做深度查询 模板语言的过滤器 ...

  6. 实验吧—隐写术——WP之 SB!SB!SB!

    我们先打开解题链接,里面是一张愤怒的小鸟里的小猪~ 既然这是隐写题,那么肯定要把图片下载下来进行分析咯~ 下载下来之后,我们看到题目中提示:LSB 什么是LSB? LSB(Least Signific ...

  7. windows server/windows同一系统下建立两个目录之间的映射关系

    应用场景,如下: 当两个不同的项目共享同一个资源目录.同一个数据库时,由于两项目根目录不一样,再加上部分项目可能有入口重写规则限制了用户的访问权限. 因此,我们可以利用window 服务器给我们提供的 ...

  8. java 类方法和实例方法 以及 类变量和实例变量 各种区别

    我们已经知道类体中的方法分为实例方法和类方法两种,用static修饰的是类方法.二者有什么区别呢?当一个类创建了一个对象后,这个对象就可以调用该类的方法. 当类的字节码文件被加载到内存时,类的实例方法 ...

  9. centos Cannot allocate memory for the buffer pool

    mysql 无法启动 ,查看日志: --01T15::.401599Z [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. P ...

  10. 从一到无穷大:科学中的事实和臆测 (G. 伽莫夫 著)

    第一部分 做做数字游戏 第一章 大数 (已看) 第二章 自然数和人工数 (已看) 第二部分 空间,时间与爱因斯坦 第三章 空间的不寻常的性质 (已看) 第四章 四维世界 (已看) 第五章 时间和空间的 ...