c++设计原则:继承与组合
2024-08-30 04:24:28
“优先使用对象组合,而不是继承”是面向对象设计的原则之一。
组合也叫“对象持有”,就是在类中定义另一类型的成员,继承会破坏类的独立性,增加系统的复杂性,一般系统的继承层次不超过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。在实现域,复合意味着根据某物实现出。
最新文章
- ASP.NET MVC VS2010中更改默认调试浏览器
- ASP.NET 字符编码的那些事
- java实现双链表(差点没写吐系列...)
- Git版本控制管理学习笔记2--起步
- 6. javacript高级程序设计-面向对象设计
- SharedPreferences的基本数据写入和读取
- Mybatis学习记录(三)----理解SqlMapConfig.xml文件
- MySQL在创建相同表结构时as和like 使用的区别
- ZGrapher 画函数曲线图的工具
- 怎么学数学[How to Study Math]
- Ext JS学习第七天 Ext自定义类,继承(二)
- 2017 Multi-University Training Contest - Team 9 1003&;&;HDU 6163 CSGO【计算几何】
- php 记录日志时 基础的日志格式
- 贝叶斯优化(Bayesian Optimization)深入理解
- 图文教程 | 开启远程访问mysql数据库权限
- Java 一维数组作为参数和返回值
- 【Python56--爬取妹子图】
- 手写Spring框架学习笔记
- 关于“最小的K个数”问题
- VS C++ 并发编程
热门文章
- 2.线程--线程安全(synchronized)
- NOIP2014提高组 题解报告
- Leetcode题目617:合并二叉树(递归-简单)
- Comet OJ - Contest #6 B.双倍快乐(二维最大上升子序列和)
- 研途APP——项目需求分析
- 安装openssh-server报Depends: openssh-client (= 1:6.6p1-2ubuntu2.8)错误
- Coroutine 协程
- 分区工具parted的使用方法
- 【Python】Python format 格式化函数(转帖)
- MauiMETA工具的使用(一)