问题:继承和组合那种是高内聚低耦合,为什么?
答:组合是高内聚低耦合。
1.高内聚:组合是通过对现有的对象进行拼装(组合)产生新的、更复杂的功能。
2.低耦合:组合不破坏封装,整体类与局部类之间松耦合,彼此相对独立。
面向对象编程讲究的是代码复用,继承和组合都是代码复用的有效方法。组合是将其他类的对象作为成员使用,继承是子类可以使用父类的成员方法。引用一个生动的比方:继承是说“我父亲在家里给我帮了很大的忙”,组合是说“我请了个老头在我家里干活”。
一.继承
在继承结构中,父类的内部细节对于子类是可见的。所以我们通常也可以说通过继承的代码复用是一种“白盒式代码复用”。
优点:
a.子类能够自动继承父类的接口
b.易于修改或扩展那些父类被子类复用的实现。
c.创建子类的对象时,无须创建父类的对象
缺点:
a.父类的内部细节对子类是可见的。
b.子类从父类继承的方法在编译时就确定下来了,所以无法在运行期间改变从父类继承的方法的行为。
c.子类与父类是一种高耦合,违背了面向对象思想。
d.继承关系最大的弱点是打破了封装,子类能够访问父类的实现细节,子类与父类之间紧密耦合,子类缺乏独立性,从而影响了子类的可维护性。
e.不支持动态继承。在运行时,子类无法选择不同的父类。
二.组合
组合是通过对现有的对象进行拼装(组合)产生新的、更复杂的功能。因为在对象之间,各自的内部细节是不可见的,所以我们也说这种方式的代码复用是“黑盒式代码复用”。
优点:
a.不破坏封装,整体类与局部类之间松耦合,彼此相对独立。
b.具有较好的可扩展性。
c.支持动态组合。在运行时,整体对象可以选择不同类型的局部对象。
缺点:
a.整体类不能自动获得和局部类同样的接口
如果父类的方法子类中几乎都要暴露出去,这时可能会觉得使用组合很不方便,使用继承似乎更简单方便。但从另一个角度讲,实际上也许子类中并不需要暴露这些方法,客户端组合应用就可以了。所以上边推荐不要继承那些不是为了继承而设计的类,一般为了继承而设计的类都是抽象类。
b.创建整体类的对象时,需要创建所有局部类的对象
三.总结
1、精心设计专门用于被继承的类,继承树的抽象层应该比较稳定,一般不要多于三层。
2、对于不是专门用于被继承的类,禁止其被继承。
3、优先考虑用组合关系来提高代码的可重用性。
4、子类是一种特殊的类型,而不只是父类的一个角色
5、子类扩展,而不是覆盖或者使父类的功能失效
参考:
https://blog.csdn.net/calllmq/article/details/7399824
https://blog.csdn.net/gvinaxu/article/details/51731202