继承与组合(笔试题)

问题:继承和组合那种是高内聚低耦合,为什么?

答:组合是高内聚低耦合。

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





猜你喜欢

转载自blog.csdn.net/qq_25815379/article/details/80728947
今日推荐