Java中消除实现继承和面向接口的编程

来源:互联网 责任编辑:栏目编辑 发表时间:2013-07-01 03:53 点击:
一个接口可以对应多个实现类,对于声明为接口类型的方法参数、类的字段,它们要比实现类更易于扩展、稳定,这也是多态的优点。面向接口编程最重要的价值在于隐藏实现,将抽象的实现细节封装起来而不对外开放,封装这对于Java EE 中的分层设计和框架设计尤其重要。

  在匆忙之际理清消除实现继承和面向接口编程这样两个大问题可不是一件容易的事情,尤其考虑到自身的认识水平。坦白的说,这又是一篇“炒冷饭”的文章,但这“冷饭”又确实不好炒。因此,在阅读了这篇文章之后,你可要批判地接受(拒绝)我的观点,尽管我的观点也是来自于别人的观点。

  继承是面向对象中很重要的概念。如果考虑到Java语言特性,继承分为两种:接口继承和实现继承。这只是技术层面的问题,即便C++中不存在接口的概念,但它的虚基类实际上也相当于接口。对于OO的初学者来说,他们很希望自己的程序中出现大量的继承,因为这样看起来很OO.但滥用继承会带来很多问题,尽管有时候我们又不得不使用继承解决问题。

  相比于接口继承,实现继承的问题要更多,它会带来更多的耦合问题。但接口继承也是有问题的,这是继承本身的问题。实现继承的很多问题出于其自身实现上,因此这里重点讨论实现继承的问题。

  举个例子(这个例子实在太老套了)。我要实现一个Stack类,我想当然地选择Stack类继承于ArrayList类(你也可以认为我很想OO些或者出于本性的懒惰);现在又有了新的需求,需要实现一个线程安全的Stack,我又定义了一个ConcurrentStack类继承于Stack并覆盖了Stack中的部分代码。

  因为Stack继承于ArrayList,Stack不得不对外暴露出ArrayList所有的public方法,即便其中的某些方法对它可能是不需要的;甚至更糟的是,可能其中的某些方法能改变Stack的状态,而Stack对这些改变并不知情,这就会造成Stack的逻辑错误。

  如果我要在ArrayList中添加新的方法,这个方法就有可能在逻辑上破坏它的派生类Stack、 ConcurrentStack.因此在基类(父类)添加方法(修改代码)时,必须检查这些修改是否会对派生类产生影响;如果产生影响的话,就不得不对派生类做进一步的修改。如果类的继承体系不是一个人完成的,或者是修改别人的代码的情况下,很可能因为继承产生难以觉察的BUG.

  问题还是有的。我们有时会见到这样的基类,它的一些方法只是抛出异常,这意味着如果派生类支持这个方法就重写它,否则就如父类一样抛出异常表明其不支持这个方法的调用。我们也能见到它的一个变种,父类的方法是抽象的,但不是所有的子类都支持这个方法,不支持的方法就以抛出异常的方式表明立场。这种做法是很不友好和很不安全的,它们只能在运行时被“侥幸捕捉”,而很多漏网的异常方法可能会在某一天突然出现,让人不知所措。

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • Java编程语言的八大优点
  • JVM对象生命周期详细介绍
  • Java平台上的CRM系统
  • Java 算数测试小程序
  • Command(命令模式)
  • Java环境 使用Resin在NT环境下配置JSP环境
  • Java 一个简单的画图程序
  • Java 日历的小程序
  • Java 统计代码的小工具
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1