刘波的学习园地

让我们一起进步!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

7.接口

Posted on 2006-11-09 14:43  Loes  阅读(303)  评论(0编辑  收藏  举报

1. 定义与实现
   对象引用包括类引用和接口引用,通过ABAP类的实例及其引用已近可以构建各种商业应用模型及其中元素,例如顾客\订单\订购的货物以及发票等.然而,在实际商业应用中,有时会出现提供相似功能的类,但内部处理方法则有所区别,然而,从用户角度看则没有什么不同.举例来说,在设计过程中有两个类代表银行储蓄系统中的两种账户: 储蓄账户和来往帐户.对于用户来说,这两种账户只有名称的不同,但其实现的基本功能都是类似的,如余额查询\计算年利率等;然而在银行的内部操作中,两种账户的利率计算方式不同.这些类之间不存在继承关系,可以创建两个完全不同且不相关联的类来分别实现,然而更适宜的方法是通过接口实现.interface既可以保障这些类外部看起来有一致性,标准化接口,又可以在不同的类内部使用不同的实现方法,而这个具体的实现过程是类外部的用户无须关心的.
    接口是一个独立结构,可以在其中定义一些成员并在具体类中实现,其作用是对垒中已经定义了的成员进行扩展.实现该接口后,接口成员将成为类的公有成员,但类可以自行对接口中的方法以其自身特定的形式实现.这样对于用户来说,不同的类对象包含相同的操作接口(即接口中定义的成员名称),但程序内部的具体实现则根据类的不同而有所区别.接口是OOP中除继承之外的另一个主要多态性的实现机制技术.
    接口没有自己的实例,因而也不需要进行方法实现,其中方法的实现要通过具体的类进行.在类定义中,接口的实现智能出现在公有部分,接口总定义的所有组建都将被添加为该类的公有成员.接口intf中的成员icomp在类内部实现过程中以名称inf~icomp的形式出现.在类的实现部分,必须包含所有接口方法实现.
    一个接口可以被任意多个不同的类实现,该接口中定义的成员集在各个类中名称相同,然而各个类中成员方法的实现方式则可以有差异,因而也就实现了多态性.如果一个类中除接口之外没有定义任何类自身的公有成员方法,则接口就成为了该类中的全部"外部接口".
接口的实现:
REPORT z_interface_demo.

*---------------------------------------------------------------------*
*       INTERFACE status
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
INTERFACE status.
  METHODS write.
ENDINTERFACE.

*---------------------------------------------------------------------*
*       CLASS counter DEFINITION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS counter DEFINITION.
  PUBLIC SECTION.
    INTERFACES status.
    METHODS increment.
  PRIVATE SECTION.
    DATA count TYPE i.
ENDCLASS.
*---------------------------------------------------------------------*
*       CLASS counter IMPLEMENTATION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS counter IMPLEMENTATION.
  METHOD status~write.
    WRITE: / 'Count in counter is',count.
  ENDMETHOD.
  METHOD increment.
    ADD 1 TO count.
  ENDMETHOD.
ENDCLASS.

*---------------------------------------------------------------------*
*       CLASS bicycle DEFINITION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS bicycle DEFINITION.
  PUBLIC SECTION.
    INTERFACES status.
    METHODS drive.
  PRIVATE SECTION.
    DATA speed TYPE i.
ENDCLASS.
*---------------------------------------------------------------------*
*       CLASS bicycle IMPLEMENTATION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS bicycle IMPLEMENTATION.
  METHOD status~write.
    WRITE: / 'Speed of bicycle is',speed.
  ENDMETHOD.
  METHOD drive.
    ADD 10 TO speed.
  ENDMETHOD.
ENDCLASS.

DATA: count TYPE REF TO counter,
      bike  TYPE REF TO bicycle,
      status TYPE REF TO status,
      status_tab TYPE TABLE OF REF TO status.

START-OF-SELECTION.

  CREATE OBJECT: count,bike.
  DO 5 TIMES.
    CALL METHOD:count->increment,
                bike->drive.
  ENDDO.
  APPEND: count TO status_tab,
          bike TO status_tab.
  LOOP AT status_tab INTO status.
    CALL METHOD status->write.
  ENDLOOP.
该输出示例如下:
 count in counter is 5
 speed fo bicycle is 50
    该例中包含两个完全无关的类bike和count,但实现了相同的接口status,因而这两个类都包含同样的方法write,该方法是在接口中定义的.

2. 接口引用
    引用变量是访问ABAP对象的途径,与基于类声明的引用变量类似,也可以基于接口声明引用变量,即接口引用.接口引用也是一种对象引用,对于包含接口的类对象,除了通过类引用访问外,还可以通过接口引用进行访问.因为接口引用可以只想任何实现了该接口的对象.
通过接口引用访问对象:
    要访问一个类对象,必须先声明一个基于该类的引用变量,如果该类为一个接口的实现,则可以将该引用变量赋给一个接口变量,此时接口引用指向相同的类对象.