继承与组合(笔试题)

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

 

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

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

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值