接口的具体操作

时间:2022-10-07 09:17:13

INTERFACE f0.
  "接口中不能设定成员的权限领域(可见性),或者说接口的组件总是public的
  "CLASS-METHODS static_meth. "接口中可以声明静态成员
  METHODS meth IMPORTING msg TYPE string OPTIONAL.
  DATA str TYPE string.
  "接口中的变量不能用value给值,而常量可以。
  CONSTANTS cons TYPE string VALUE '常量'.
ENDINTERFACE.                    "f0
"接口只声明方法,不实现方法,没有implementation部分。

CLASS c1 DEFINITION."不能使用INHERITING FROM 继承借口。
  PUBLIC SECTION.
    METHODS:outp.
INTERFACES:f0.
  "只能在PUBLIC SECTION中声明要使用的接口,可以声明多个接口。
  "可以用aliases..for..语句,为接口的每个组件指定别名,方便访问。
  "别名只能被当前类和实例访问。
  ALIASES meth0 FOR f0~meth.
ENDCLASS.

CLASS c1 IMPLEMENTATION.
  METHOD f0~meth"可以使用别名meth0
    WRITE: / , msg.
  ENDMETHOD.
  METHOD outp.
    WRITE: / 'test'.
  ENDMETHOD.
ENDCLASS.

CLASS c2 DEFINITION.
  PUBLIC SECTION.
    INTERFACES:f0.
ENDCLASS.

CLASS c2 IMPLEMENTATION.
  METHOD f0~meth.
    WRITE: /  ,msg.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  DATA ref0 TYPE REF TO f0."定义接口的引用
  DATA ref1 TYPE REF TO c1.
  DATA ref2 TYPE REF TO c2.
  CREATE OBJECT:ref1,ref2.

  "把不同的对象分别赋给接口的引用 ————多态性的体现。
  ref0 = ref1.
  ref0->meth('C1使用接口').
  ref0 = ref2.
  ref0->meth('C2使用接口').

  "接口的引用只能调用它自身所声明了的组件。
  "类中新定义的组件,对接口(的引用)是不可见的。
  "打开下面这句将会报错。
*            ref0->outp( ).

  "下面三种调用METHOD的写法是等效的:
  CALL METHOD ref1->meth0
    EXPORTING
      msg 'test'.
  CALL METHOD ref1->meth0'test' ).
  ref1->meth0'test' )."最简形式。
  "如果要传递多个参数,可以这样写:
*            ref1->meth0( P1 = f1 P2 = f2 ).

  "目前ABAP对圆括号的定义尚未规范化:
  "括号与参数间可能需要空格,也可能不用空格。
  "具体用的时候多尝试即可。

  "组件没有别名时,可以用波浪号访问
*            ref1->f0~meth( ).