第16条:复合优先于继承

原创 2012年03月21日 21:36:16
这里的继承是实现继承而非接口继承。
与方法调用不同的是,继承打破了封装性:
换句话说,子类依赖于其超类中特定功能的实现细节。超类的实现有可能会随着发型版本的不同而发生改变,如果真的发生了变化,子类可能会遭到破坏,即使他的代码完全没有改变。因此,子类必须跟着超类的更新而改变,除非超类是专门为扩展而设计的,并用具有很好的文档说明。
只有当子类真正是超类的子类型(subtype)时,才适合用继承,也就是是“is-a”关系时。
如果在适合于是用复合的地方是用了继承,则会不必要的暴漏实现细节。这样的到的API会把你限制在原始的实现上,永远限定了类的性能。更为严重的是,由于暴漏了内部细节,客户端就有可能直接访问这些内部细节。这样至少会导致语义上的混淆。例如:Properties,getProperty(String key)就有可能产生与get(Object key) 不同的结果。
对于你正视图扩展的类,他的API有没有缺陷?如果有,你愿意把那些缺陷传播到子类的API中?而符合则允许设计新的API来隐藏这些缺陷。


可以不扩展现有的类,而是在新类中增加一个私有域,他 引用现有类一个实例。这种设计叫做“复合(composition)”,因为现有的类变成新类的一个组件。新类中的每个实例方法都可以调用被包含的现有类实例中对应的方法,并返回他的结果。这被成为转发(forwarding),新类中的方法被成为转发方法(forwarding method)。 

EffectiveJava(16)复合优先于继承

为什么复合优先于继承? 1.继承违反了封装原则,打破了封装性 2.继承会不必要的暴露API细节,称为隐患.比如通过直接访问底层使p.getProperty(K,V)的键值对可以不是...
  • JacXuan
  • JacXuan
  • 2017年03月02日 00:35
  • 6161

复合优先于继承

你会遇到这种情况么: A'类继承A类 A‘重写 父类A的a1,a2方法     a1’,a2‘ 但是  A类中的a1是基于a2方法去实现的。 如果a1’调用父类A类的a1方法,那么就会继续调用到a...
  • democreen
  • democreen
  • 2015年12月03日 12:07
  • 990

第16条:复合优先于继承

术语:         继承(inhe)
  • u014723123
  • u014723123
  • 2014年06月30日 14:40
  • 1014

《Effective java》读书记录-第16条-复合优先于继承

与方法调用不同的是,继承打破了封装性。 public class InstrumentHashSet extends HashSet { private int addCount=0...
  • sunyx1130
  • sunyx1130
  • 2016年01月12日 15:54
  • 188

复合优先于继承。

博文中的内容来源《Effective Java Second Edition》这一本书,感激不尽。
  • en_joker
  • en_joker
  • 2017年10月18日 20:37
  • 66

Effective Java 第16条 : 复合优先于继承

继承(指的是子类扩展超类,并不包含接口)是实现代码重用的有力手段,但它并不总是完成这项工作的最佳工具。不适当地使用继承会导致脆弱的软件。      与方法调用不同的是,继承打破了封装性。换句话说子类...
  • hosterZhu
  • hosterZhu
  • 2013年08月03日 15:36
  • 2011

Effective Java学习--第16条:复合优先于继承

在系统分析设计这门课中某王就不停地强调一点,就是ISA(is a 原则)。都知道继承是面向对象的一大要素,但是哪里使用复合哪里使用继承,其实还是有讲究的。可以简单的用ISA原则概括。有一个具备一定功能...
  • u013815546
  • u013815546
  • 2016年05月06日 14:09
  • 457

(16):复合优先于继承

继承是实现代码重用的的有力手段,但它未必是最好的方法。对于普通的具体类进行跨越包边界的继承,则是非常危险的。这里的继承指的是一个类扩展另一个类的继承而非接口继承。 继承的一大缺点在于打破了封装性。子...
  • ahui2333
  • ahui2333
  • 2017年04月06日 15:02
  • 96

第十六条:复合优先于继承

一、什么是复合 复合也可为称为装饰者模式,那么如何使用装饰者模式呢。 首先:创建被装饰接口 其次:创建被装饰类 然后:创建装饰类 那么我们就以装饰水果篮子为例。 装饰类就是:Apple、Orang...
  • chen19960724
  • chen19960724
  • 2016年08月17日 17:17
  • 135

面向对象设计原则七 - 组合优先于继承

组合通过创建一个由其他对象组合的对象来获得新功能的重用方法新功能的获得是通过调用组合对象的功能实现的有时又叫聚合例如: 一个对象拥有或者对另外一个对象负责并且两个对象有相同的生命周期。(GOF)一个对...
  • zjliu1984
  • zjliu1984
  • 2009年06月26日 09:31
  • 5631
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第16条:复合优先于继承
举报原因:
原因补充:

(最多只允许输入30个字)