组合与继承的比较

类继承:白盒复用,父类的内部实现细节对子类可见
组合:黑盒复用,对象的内部细节不可见

类继承在编译时刻静态定义。且可直接使用。一个子类重新定义一些而不是父类的全部操纵
类继承不足:
1.因为继承在编译时刻就定义好。所以无法在运行时改变从父类继承的实现。
2.更糟糕的是,父类至少定义了部分子类的具体表示,因为继承对子类揭示了其父类的实现,所以破坏了封装性。
3。且子类与父类依赖关系紧密。以至于父类的任何改变必然导致子类的变化
4.最后如果继承的实现不适合解决新问题。父类可能重写或者被其他类替代。这种方式限制的复用性。
上述不足的解决方式----继承抽象

组合:对其他对象的引用是在运行时刻定义。
1.对象只能通过接口访问。所以不破坏封装性
2.只要类型一致。一个对象可以用另一个对象代替。
3.对象的实现基于接口,所以实现上存在较少的依赖关系。
4对象组合对系统设计还有另一个作用。即优先使用对象组合有助于帮你保持每个类被封装,并集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。另一方面,基于对象组合的设计会有更多的对象(而有较少的类),且系统的行为将依赖与对象间的关系而不是被定义在某个类中
 

来自:《Head First设计模式(中文版)》 和 《Gof设计模式》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值