《6.7继承的利弊和使用原则.docxVIP

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《6.7继承的利弊和使用原则

6.7 继承的利弊和使用原则继承是一种提高程序代码的可重用性,以及提高系统的可扩展性的有效手段。在第1章的1.3.7节(继承、扩展、覆盖)曾经以Servlet为例,演示了继承在创建框架类软件中的运用。但是,如果继承树非常复杂,或者随便扩展本来不是专门为继承而设计的类,反而会削弱系统的可扩展性和可维护性。6.7.1 继承树的层次不可太多继承树(不考虑顶层的Object类)的层次应该尽量保持在两到三层。图6-5和图6-6分别显示了设计合理的继承树和设计不合理的继承树。如果继承树的层次很多,会导致以下弊端:(1)对象模型的结构太复杂,难以理解,增加了设计和开发的难度。继承树底层的子类会继承上层所有直接父类或间接父类的方法和属性,假如子类和父类之间还有频繁的方法覆盖和属性被屏蔽的现象,那么会增加运用多态机制的难度,难以预计在运行时方法和属性到底和哪个类绑定。(2)影响系统的可扩展性。继承树的层次越多,在继承树上增加一个新的继承分支需要创建的类越多。图6-5 设计合理的三层继承树 图6-6 设计不合理的六层继承树 6.7.2 继承树的上层为抽象层当一个系统使用一棵继承树上的类时,应该尽可能地把引用变量声明为继承树的上层类型,这可以提高两个系统之间的松耦合。例如动物饲养员Feeder的feed()方法,它的参数为Animal和Food类型:feed(Animal animal,Food food)Tips如果继承树上有接口类型,那么应该尽可能地把引用变量声明为继承树上层的接口类型,参见第8章(接口)。位于继承树上层的类具有以下作用:定义了下层子类都拥有的相同属性和方法,并且尽可能地为多数方法提供默认的实现,从而提高程序代码的可重用性。代表系统的接口,描述系统所能提供的服务。在设计继承树时,首先进行自下而上的抽象,即识别子类之间所拥有的共同属性和功能,然后抽象出共同的父类,位于继承树最上层的父类描述系统对外提供哪些服务。如果某种服务的实现方式适用于所有子类或者大多数子类,那么在父类中就实现这种服务。如果某种服务的实现方式取决于各个子类的特定属性和实现细节,那么在父类中无法实现这种服务,只能把代表这种服务的方法定义为抽象方法,并且把父类定义为抽象类。比如热水器父类可分为电热水器和燃气热水器这两个子类,电热水器和燃气热水器采用不同的方式烧水,在热水器父类中无法提供烧水的具体实现,因此必须把热水器父类定义为抽象类。public abstract class WaterHeating{/** 烧水 */public abstract void heating(); /** 调节水温 */public abstract void adjust(int level);}由于继承树上层的父类描述系统对外提供的服务,但不一定实现这种服务,因此把继承树的上层称为抽象层。在进行对象模型设计时,应该充分地预计系统现在必须具备的功能,以及将来需要新增的功能,然后在抽象层中声明它们。抽象层应该比较稳定,这可以提高与其他系统的松耦合及系统本身的可维护性。6.7.3 继承关系最大的弱点:打破封装继承关系最大的弱点就是打破了封装。在第1章的1.3.5节(封装、透明)介绍封装时,曾经提到每个类都应该封装它的属性及实现细节,这样,当这个类的实现细节发生变化时,不会对其他依赖它的类造成影响。而在继承关系中,子类能够访问父类的属性和方法,也就是说,子类会访问父类的实现细节,子类与父类之间是紧密耦合关系,当父类的实现发生变化时,子类的实现也不得不随之变化,这削弱了子类的独立性。由于继承关系会打破封装,这增加了维护软件的工作量。尤其在一个Java软件系统使用了一个第三方提供的Java类库的场合。例如在基于Web的Java应用中,目前都流行使用Apache开源软件组织提供的Struts框架,这个框架的一个扩展点为Action类。在Struts 1.0版本中,Action类有两个方法:perform()和saveErrors()。public ActionForward perform(ActionMapping mapping,ActionForm form,ServletRequest request,ServletResponse response)throws Exceptionprotected void saveErrors(HttpServletRequest request, ActionErrors errors)在Java应用中,可以创建继承Action类的子类,例如LoginAction,然后在LoginAction类中覆盖Action类的perform()方法,在perform()方法中则会调用saveErrors()方法。public class LoginAc

您可能关注的文档

文档评论(0)

lisufan + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档