第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)。 
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

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

EffectiveJava(16)复合优先于继承

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

(16):复合优先于继承

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

复合优先于继承

package com.laz.learning; import java.util.Collection; import java.util.Iterator; import java.util....
  • luoaz
  • luoaz
  • 2011-11-06 15:17
  • 410

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作为桥梁连接...

Hibernate4学习总结(3)--注解形式的基础映射,主键映射,基本属性映射,复合属性映射,继承映射。

Hibernate Annotation即hibernate注解,可以通过另一种方式将持久化类转化成表的相关信息,可以简化hibernate的配置文件。本文主要对Hibernate的注解进行讲解,由于...

学习effective java-16类和接口之复合优于继承

该知识点是自己从书籍中学习的笔记。 与方法调用不同,继承打破了类的封装特性。使用继承估计会出现以下问题: 1.  如果父类发生了变化,那么子类也需要检查是否需要更新。 2.  开始时,子类有一个...

第二章 .Net 控件开发(WebForm) 开发自定义复合控件(1) 继承ComPositeControl类以及子控件

1、 第一章介绍了继承Control类或WebControl类开发自定义控件,以及呈现的Html标记文本和回传功能,这章我们将上述功能委托给标准或者自定义控件的自定义控件,这种控件称为复合控件,因为它...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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