接口的学习

1.接口是面向对象的多态性的一种形式,一个接口可以被不同的class实现,接口的属性,方法,事件相同但是在不同的方法中实现的具体功能是不同的;

2.abap中可以使用SE24定义接口,也可以在代码上定义接口;

以下代码总结说明:

*&---------------------------------------------------------------------*
*& Report  ZTEST_INTERFACE
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ztest_interface.

*----------------------------------------------------------------------*
*       INTERFACE status
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
INTERFACE worth.
  CONSTANTS: price TYPE p LENGTH 15 DECIMALS 2 VALUE '1234.22'.
ENDINTERFACE.                    "worth

*----------------------------------------------------------------------*
*       INTERFACE status
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
INTERFACE status.
  METHODS write.
  INTERFACES worth.
ENDINTERFACE.                    "


*----------------------------------------------------------------------*
*       CLASS counter DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS counter DEFINITION.
  PUBLIC SECTION.
    INTERFACES status.
    INTERFACES worth.
    METHODS increment.
  PRIVATE SECTION.
    DATA count TYPE i.
ENDCLASS.                    "counter DEFINITION

*----------------------------------------------------------------------*
*       CLASS counter IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS counter IMPLEMENTATION.
  METHOD status~write.
    WRITE: / 'Count in counter is' ,count.
  ENDMETHOD.                    "status~write

  METHOD increment.
    ADD 1 TO count.
  ENDMETHOD.                    "status~write
ENDCLASS.                    "counter IMPLEMENTATION

*----------------------------------------------------------------------*
*       CLASS bicycle DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS bicycle DEFINITION.
  PUBLIC SECTION.
    INTERFACES status.
    INTERFACES worth.
    METHODS drive.
  PRIVATE SECTION.
    DATA speed TYPE i.
ENDCLASS.                    "bicycle DEFINITION

*----------------------------------------------------------------------*
*       CLASS bicycle IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS bicycle IMPLEMENTATION.
  METHOD status~write.
    WRITE: / 'speed of bicycle is', speed.
  ENDMETHOD.                    "status~write
  METHOD drive.
    ADD 10 TO speed.
  ENDMETHOD.                    "drive
ENDCLASS.                    "bicycle IMPLEMENTATION

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.

*1.接口  status中定义了一个write方法,可以通过类引用变量和接口引用变量两种方式去访问
  CALL METHOD count->status~write. "类引用变量访问
  status = count.
  CALL METHOD status->write.       "接口引用变量访问

  APPEND:count TO status_tab,
         bike TO status_tab.
*2.接口引用间赋值
  DATA status1 TYPE REF TO object.  "参照空类object定义的变量
  DATA status2 TYPE REF TO counter. "参照类定义的变量
  DATA worth TYPE REF TO worth.
  status = count.      "因为count中引用过status这个接口,所以可以直接赋值
  worth = status.      "因为接口status中引用过接口worth,所以可以直接赋值
  status ?= worth.     "因为接口worth中没有引用过接口status,所以必须强制赋值
  status2 ?= status.   "类引用可以直接赋值给接口引用,接口引用想赋值给类引用必须强制赋值,备注:前提该类是引用过该接口的
  status1 = count.     "参照空类object定义的变量, 可以随便给他直接赋值
  status1 = worth.     "参照空类object定义的变量, 可以随便给他直接赋值
*3.访问接口定义的静态成员
*3.1对于接口中定义的静态成员,如果该成员是常量,则只能通过接口引用进行访问
*如:intf=>const
*3.2 对于其他静态接口成员,则可以通过接口的类本身或者类的引用进行访问
*如:class=>intf~attr  或 call method class=>intf~meth

  DATA lv_price TYPE p LENGTH 15 DECIMALS 2.
  "lv_price = count->worth~price.
  lv_price = worth->price.
  LOOP AT status_tab INTO status.
    CALL METHOD status->write.
  ENDLOOP.
原文地址:https://www.cnblogs.com/caizjian/p/5519966.html