首先需要了解继承和组合两者各自的概念和特点
一、继承
简单来说,A类继承B类,说明A是B的一种,A在B的基础上做扩展,A能使用B中的除私有成员外的所有元素和方法,且由A派生的其他类最后可通过B类容器存储调用,实现不同派生类的虚函方法。
举例来说,人是基类,小孩是人的派生类,大人也是人的派生类,人类中的走是一个虚函数,小孩中的走是爬着走,大人是两条腿走,小孩和大人这两个派生类都属于人,都需要走路,只是走路的方式不同,我们就可以用继承来实现。
二、组合类
组合类就像是有许多零件组建成一台能工作的机器,零件为机器提供功能,但又不只属于这台机器,只是它的一个部分,所以机器不能从零件中派生出来,只能组合起来。
需要注意,组合类中的构造函数需要使用初始化链表方式去初始化。
三、继承的优点和缺点
优点
容易进行新的实现,因为其大多数可从基类继承而来。
易于修改或扩展那些被复用的方法。
创建子类的对象时,无须创建父类的对象
缺点
破坏封装,子类与父类之间紧密耦合,子类依赖于父类的实现,子类缺乏独立性
“白盒”复用,因为父类的内部细节对于子类而言通常是可见的。
支持扩展,但是往往以增加系统结构的复杂度为代价
不支持动态继承。在运行时,子类无法选择不同的父类
子类不能改变父类的接口,但子类可以覆盖父类的接口
四、组合类的优点和缺点
优点
容器类仅能通过被包含对象的接口来对其进行访问。
“黑盒”复用,因为被包含对象的内部细节对外是不可见。 封装性好。
实现上的相互依赖性比较小。
每一个类只专注于一项任务。
通过获取指向其它的具有相同类型的对象引用,可以在运行期间动态地定义(对象的)组合。
缺点
整体类不能自动获得和局部类同样的接口
创建整体类的对象时,需要创建所有局部类的对象
五、继承和组合的适用场景
继承体现的是一种专门化的概念而组合则是一种组装的概念
另外确定是组合还是继承,最清楚的方法之一就是询问是否需要新类向上映射,也就是说当我们想重用原类型作为新类型的内部实现的话,我们最好自己组合,如果我们不仅想重用内部实现而且还想重用接口的话,那就用继承。
六、规则
一般对于大型程序来说,优先使用组合,组合还有一个优点就是有助于保持每个类被封装,并被集中在单个任务上(类设计的单一原则)。这样类的层次结构不会扩大,一般不会出现不可控的庞然大类。而类的继承就可能出来这些问题,所以一般编码规范都要求类的层次结构不要超过3层。但具体使用还是需要看适用场景和需求灵活去运用。