background image

护上的麻烦。因为如果后来想修改类的界面(一般通过 abstract class 或者 interface 来表
示)以适应新的情况(比如,添加新的方法或者给已用的方法中添加新的参数)时,就
会非常的麻烦,可能要花费很多的时间(对于派生类很多的情况,尤为如此)。但是如果
界面是通过 abstract class 来实现的,那么可能就只需要修改定义在 abstract class 中的默认

 

行为就可以了。

  同样,如果不能在抽象类中定义默认行为,就会导致同样的方法实现出现在该抽象
类的每一个派生类中,违反了"one rule,one place"原则,造成代码重复,同样不利于以
后的维护。因此,在 abstract class 和 interface

 

间进行选择时要非常的小心。

  三、从设计理念层面看 abstract class 和 interface 

  上面主要从语法定义和编程的角度论述了 abstract class 和 interface 的区别,这些层面
的区别是比较低层次的、非本质的。本小节将从另一个层面:abstract class 和 interface 所反
映出的设计理念,来分析一下二者的区别。作者认为,从这个层面进行分析才能理解二者

 

概念的本质所在。

  前面已经提到过,abstarct class 在 Java 语言中体现了一种继承关系,要想使得继承关
系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相
同的(参考文献〔3〕中有关于"is a"关系的大篇幅深入的论述,有兴趣的读者可以参考)。
对于 interface 来说则不然,并不要求 interface 的实现者和 interface 定义在概念本质上是一
致的,仅仅是实现了 interface 定义的契约而已。为了使论述便于理解,下面将通过一个简

 

单的实例进行说明。

  考虑这样一个例子,假设在我们的问题领域中有一个关于 Door 的抽象概念,该 Door
具有执行两个动作 open 和 close,此时我们可以通过 abstract class 或者 interface 来定义一

 

个表示该抽象概念的类型,定义方式分别如下所示:

  使用 abstract class 方式定义 Door  

  abstract class Door { 

  abstract void open(); 

  abstract void close()  

  } 

  使用 interface 方式定义 Door  

  interface Door { 

  void open();