您的位置:首页 > 编程语言 > Java开发

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

2014-10-10 22:07 169 查看
继承是实现代码重用的有力手段,但它并非永远是完成这项工作的最佳工具。使用不当会导致软件变得脆弱。在包的内部使用继承是非常安全的,在那里,子类和超类的实现都处在同一个开发人员的控制之下。对于专门为了继承而设计、并且具有很好的文档说明的类说,使用继承也是非常安全的。然而,对普通的具体类,进行跨越包边界的继承,则是非常危险的。


一、继承打破了封装性

换句话说,子类依赖于其父类中特定功能的实现细节。父类的实现有可能会随着发行版本的不同而有所变化,如果真的发生了变化,子类可能会遭到破坏。这样一来,子类就需要跟随着父类的改变而改变。


二、复合

有一种方法可以解决继承中的问题:不用扩展现有的类,而是在新的类中增加一个私有域,它引用现有类的一个实例。这种设计就是复合(composition)。

因为现有的类变成了新类的一个组件。新类中的每个实例方法都可以调用被包含的现有类实例中的方法,并返回它的结果。这也叫做转发(forwarding method)。这样的类会非常稳定,它不依赖于现有类的实现细节。

有时候,复合转发的结合也被错误地成为“委托”。从技术的角度来说,这并不是委托,除非包装对象把自身传递给被包装的对象。

只有当子类真正是超类的子类型时,才适合用继承。换句话说,对于两个类A和B,只有当两者之间确实存在“is-a”关系的时候,类B才应该扩展类A。如果你打算让A拓展B,就应该先问一下自己:每一个B确实也是A吗?

我的博客原文:http://www.oak.hk/blog/2014/10/08/favor-composition-over-inheritance/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  EffectiveJava