第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)。 

第16条:复合优先于继承

术语:         继承(inhe)

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

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

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

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

Effective Java读书笔记-复合优先于继承

继承是完成代码重用的有力手段,但它并非是完成这项工作的最佳工具。使用不当通常会导致软件非常的脆弱。在包的内部使用继承是非常安全的。对于普通的具体的类进行跨越包的边界的继承将是非常危险的。继承打破了封装...
  • G7S9R
  • G7S9R
  • 2017年11月23日 16:00
  • 27

复合优先于继承

package com.laz.learning; import java.util.Collection; import java.util.Iterator; import java.util....
  • luoaz
  • luoaz
  • 2011年11月06日 15:17
  • 430

(16):复合优先于继承

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

EffectiveJava(16)复合优先于继承

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

Java学习笔记13:复合优先于继承

继承是实现代码重用的有力手段,但它并非永远是完成这项工作的最佳工具。使用不当会导致软件变得脆弱。在包的内部使用继承是非常安全的,在那里,子类和超类的实现都处在同一个开发人员的控制之下。对于专门为了继承...

Effective Java学习笔记:复合优先于继承

学习《Effective java》的过程中,对十六条:复合优先于继承这一条有深刻的印象。 书中用到了一个非常经典的例子来解释这一点: public class InstrumentedHashSe...

effective stl 第16条: 了解如何把vector和string数据传给旧的API

#include #include #include #include #include #include #include using namespace std; //vector作为桥梁连接...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第16条:复合优先于继承
举报原因:
原因补充:

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