“优先使用对象组合,而不是继承”是面向对象设计的原则之一。

组合也叫“对象持有”,就是在类中定义另一类型的成员,继承会破坏类的独立性,增加系统的复杂性,一般系统的继承层次不超过3层。组合拥有良好的扩展性,支持动态组合,因此优先考虑组合方法。

看一个例子,有这样一个类:

class Eye
{
public:
void Look(void);
};

现在希望定义一个Head类,也想实现Look的功能,应该使用组合方法,实现代码重用,即:

class Head
{
public:
Eye _eye; //Eye对象作为Head的一个成员
};

组合是在新类中以原有类的对象作为数据成员,继承是在不改变现有的类的基础上,采用现有类的形式并在其中添加新代码,组合一般用于在新类中使用现有类的功能而不是它的接口的情况,就是新类用户看到的只是为新类所定义的接口。而继承则是用于在新类需要向基类转化的情况(多态),这也是组合和继承使用的最清晰的判断方法。

我们只需让Eye作为Head的一个成员即可,而让Head去继承Eye的特性是没有必要的。

再看一个例子:有A,B,C三个类,其中B继承A,而A使用C的功能(即组合),那么我们可以这些写:

#include <iostream>
using namespace std;
class C
{
public:
void print_all()
{
cout << "hello all." << "\n";
} }; class A
{
public:
virtual void print(){cout << "hello A" << '\n';}
void _print()
{
c.print_all();
}
C c; //C的对象c作为A的成员
}; class B:public A
{
public:
void print(){cout << "hello B" << "\n";}
}; int main(int argc, char const *argv[])
{
B b;
b.print(); //hello B
b._print(); //hello all.
return ;
}

在应用域,符合意味着has-a。在实现域,复合意味着根据某物实现出。

最新文章

  1. ASP.NET MVC VS2010中更改默认调试浏览器
  2. ASP.NET 字符编码的那些事
  3. java实现双链表(差点没写吐系列...)
  4. Git版本控制管理学习笔记2--起步
  5. 6. javacript高级程序设计-面向对象设计
  6. SharedPreferences的基本数据写入和读取
  7. Mybatis学习记录(三)----理解SqlMapConfig.xml文件
  8. MySQL在创建相同表结构时as和like 使用的区别
  9. ZGrapher 画函数曲线图的工具
  10. 怎么学数学[How to Study Math]
  11. Ext JS学习第七天 Ext自定义类,继承(二)
  12. 2017 Multi-University Training Contest - Team 9 1003&amp;&amp;HDU 6163 CSGO【计算几何】
  13. php 记录日志时 基础的日志格式
  14. 贝叶斯优化(Bayesian Optimization)深入理解
  15. 图文教程 | 开启远程访问mysql数据库权限
  16. Java 一维数组作为参数和返回值
  17. 【Python56--爬取妹子图】
  18. 手写Spring框架学习笔记
  19. 关于“最小的K个数”问题
  20. VS C++ 并发编程

热门文章

  1. 2.线程--线程安全(synchronized)
  2. NOIP2014提高组 题解报告
  3. Leetcode题目617:合并二叉树(递归-简单)
  4. Comet OJ - Contest #6 B.双倍快乐(二维最大上升子序列和)
  5. 研途APP——项目需求分析
  6. 安装openssh-server报Depends: openssh-client (= 1:6.6p1-2ubuntu2.8)错误
  7. Coroutine 协程
  8. 分区工具parted的使用方法
  9. 【Python】Python format 格式化函数(转帖)
  10. MauiMETA工具的使用(一)