首页 理论教育接口与抽象类-信息系统开发方法

接口与抽象类-信息系统开发方法

【摘要】:以Java语言为例,来说明接口与抽象类的区别。在Java语言中,abstract class和inter-face是支持抽象类定义的两种机制。在面向对象领域,抽象类主要用来进行类型隐藏。6)抽象类中的变量默认是friendly型,其值可以在子类中重新定义,也可以重新赋值。接口是系统最高层次的抽象类型,抽象类则是介于“抽象”与“实现”之间的半成品,力所能及地完成了部分实现。抽象类为了逻辑的封装,包含部分实现,同时要求子类必须按照某种方式实现。

以Java语言为例,来说明接口与抽象类的区别。在Java语言中,abstract class和inter-face是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换。因此很多开发者在进行抽象类定义时,对于abstract class和interface的选择显得比较随意。其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解,对于设计意图的理解是否正确、合理。本节将对它们之间的区别进行剖析,试图给开发者提供一个在二者之间进行选择的依据。

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,则这样的类就是抽象类。抽象类往往用来表征在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但本质上相同的具体概念的抽象。比如,如果进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念。它们是不同的,但是它们又都属于形状这个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够被实例化的。

在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一组固定行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意一个可能的具体实现,则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的,通过从这个抽象体派生,也可扩展此模块的行为功能。

抽象类与接口的区别如下:

1)在abstract class方式中,可以有自己的数据成员,也可以有非abstract的成员方法。而在interface方式的实现中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。从某种意义上说,interface是一种特殊形式的abstract class。

2)abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系(因为Java不支持多继承)。但是,一个类却可以实现多个interface。(www.chuimin.cn)

3)在abstract class的定义中,可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为。为了绕过这个限制,必须使用委托,但是这会增加一些复杂性,有时会造成很大的麻烦。

4)实现抽象类和接口必须实现其中的所有方法。抽象类中可以有非抽象方法,接口中则不能有实现方法。

5)接口中定义的变量默认是public static final型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。接口中的方法默认都是public与abstract类型的。

6)抽象类中的变量默认是friendly型,其值可以在子类中重新定义,也可以重新赋值

抽象类与接口都位于继承树的上方,都不能被实例化,都可以包含抽象方法。但前者可以提供默认实现,后者必须包含抽象方法。接口一旦确定就不能随意改动了,否则会带来太多的麻烦,所以接口一般用来作为纯粹的规格描述。接口不要求它的实现类在语义上是同一类型,所以要是非同类型的相同方法可以使用接口,利于继承树的合理化。接口是系统最高层次的抽象类型,抽象类则是介于“抽象”与“实现”之间的半成品,力所能及地完成了部分实现。定制模式就是一种接口颗粒度细化的设计模式。抽象类为了逻辑的封装,包含部分实现,同时要求子类必须按照某种方式实现。