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