ABAP学习(14):ABAP面向对象

ABAP面向对象

1、类的定义与实现

类定义:

语法:Class <类名> definition.

        Public section.

            Methods:<方法名> Importing <参数名> type <参数类型>

                             Exporting <参数名> type <参数类型>.

      Endclass.

 

类实现:

语法:Class <类名> implementation.

        Public section.

            Method <方法名>.

                实现具体代码块.

            Endmethod.

      Endclass.

 

2、抽象类

    抽象类定义,抽象方法定义,使用Abstract关键字。

示例:

"抽象类定义
"抽象类可以包含静态成员 class-data ,class-methods,class-events
"抽象类可以包含非抽象方法
"抽象类可以不定义任何方法
"抽象类 不可以create object 创建实例,但是可以用create object type ref to 创建抽象类引用,并接受子类实例
CLASS base_class DEFINITION ABSTRACT.  "抽象类 关键子abstract,基类
  PUBLIC SECTION.
     METHODS:message ABSTRACT          "抽象方法
                IMPORTING msg TYPE String OPTIONAL.
     METHODS:sayHello FINAL.                 "非抽象方法,final方法
     METHODS:sayBye.                         "非抽象方法
ENDCLASS.

"抽象类实现,如果抽象类没有非抽象方法,可以没有实现部分
CLASS base_class IMPLEMENTATION.
      METHOD sayHello.
            WRITE:/ 'hello world base_class'.
      ENDMETHOD.
METHOD sayBye. WRITE:/ 'bye bye base_class'. ENDMETHOD. ENDCLASS.

3、类继承

使用super类继承base_class类。使用关键字Inheriting from。

示例:

"super类定义,继承基类
"final 方法:
"final类中方法,自动识别为final方法,final类不可以定义abstract方法
"非final类中用 final声明final方法,非final类final方法可以被子类继承,但不能重定义
CLASS super_class DEFINITION INHERITING FROM base_class. "继承 inheriting from
  PUBLIC SECTION.
    METHODS: message REDEFINITION.  "重定义
*    METHODS: sayHello REDEFINITION. "final方法不能重定义,编译报错
    METHODS: sayBye REDEFINITION.
ENDCLASS.

"super类实现
CLASS super_class IMPLEMENTATION.
    METHOD message.
        WRITE:/ 'super_class:',msg .
    ENDMETHOD.

    "final方法不能在子类中重定义,编译报错
*    METHOD sayHello.
*      MESSAGE s000 WITH 'hello world super_class'.
*    ENDMETHOD.

    METHOD sayBye.
      WRITE:/ 'bye bye super_class'.
    ENDMETHOD.
ENDCLASS.

4、Final关键字

    使用Final关键字定义final方法,final类。

示例:

"final类定义
"final类:最终类,关键词fianl,不可以再被继承
"final类可以是抽象类,这种情况只能使用它的静态组件
CLASS final_class DEFINITION FINAL INHERITING FROM super_class.
  PUBLIC SECTION.
    METHODS:message REDEFINITION.
    METHODS:message1 IMPORTING msg TYPE String OPTIONAL.

ENDCLASS.

CLASS final_class IMPLEMENTATION.
  METHOD message.
    "调用父类实现方法
    CALL METHOD super->message
                EXPORTING msg = msg.
  ENDMETHOD.

  METHOD message1.
    "通过me->调用当前类其他方法,相当于this,但不要用me->message1,在当前方法,调用他自身
    CALl METHOD me->message
                EXPORTING msg = msg.
  ENDMETHOD.
ENDCLASS.

5、类实例化与调用

    类变量定义:

语法:Data:<变量名> type ref to <类名>.

类对象实例化:

语法:create object <变量名>.

这里的变量名相当于一个对应<类名>的实例化对象。

调用方法:

语法:<变量名>-><方法名>(参数1 = 值 [参数2 = 值]).

语法:call method <变量名>-><方法名>(参数1 = 值 [参数2 = 值]).

语法:call method <变量名>-><方法名> exporting <参数> = 值

示例:

"程序开始,main函数
START-OF-SELECTION.
  DATA base_obj TYPE REF TO base_class.  "创建基类引用
  DATA final_obj TYPE REF TO final_class. "创建子类引用
  "创建子类实例
  CREATE OBJECT final_obj.
  "可以将子类直接付给父类或者基类
  base_obj = final_obj.

  "调用方法
  base_obj->message('hello base_obj').
  base_obj->sayHello( ). "调用的是基类hello方法,因为hello为final方法,父类可以继承,但没有重写
  base_obj->sayBye( ).   "调用的是父类的bye方法
  "也可这样写
  CALL METHOD base_obj->message
              EXPORTING
                 msg = 'hello base_obj 1'.

"OO方法动态调用
   DATA meth TYPE String.
   meth = 'MESSAGE1'.
   CALL METHOD final_obj->(meth)
               EXPORTING
                 msg = 'hello final_obj message1'.

6、类的构造

    ABAP中构造分类实例构造和静态构造。

示例:

"abap构造器
"abap有实例构造和静态构造,
"实例构造:constructor:
"方法名固定,
"每一次创建对象时调用,
"子类自定义constructor中,必须调用super->constructor,父类构造

"静态构造:class_constructor:
"方法名固定,
"只能被系统调用,
"类加载时调用一次,
"静态构造只能访问类的静态属性

"构造方法不能被继承,所以不能在子类对构造方法redefination
"不能直接用call method 调用构造方法,除非是在子类constructor中,调用super->constructor.
"实例构造只有输入importing参数没有exporting参数.
"静态构造没有参数.
"构造方法必须在public部分定义
"构造方法不能是abstract
"静态方法不能被子类重写,除了静态构造。

"父类定义
CLASS super_class DEFINITION.
  PUBLIC SECTION.
    DATA msg TYPE String.
    CLASS-METHODS:class_constructor. "静态构造方法,没有参数
    METHODS:constructor IMPORTING msg TYPE String OPTIONAL.  "实例构造方法,不能有输出参数
ENDCLASS.

"父类实现
CLASS super_class IMPLEMENTATION.
  METHOD class_constructor.
     WRITE:/ '父类静态构造方法'.
  ENDMETHOD.

  METHOD constructor.
    me->msg = msg.
    WRITE:/ msg.
    WRITE:/ '父类实例构造方法'.
    WRITE:/ '父类开始初始化'.
  ENDMETHOD.
ENDCLASS.

"子类定义
CLASS child_class DEFINITION INHERITING FROM super_class.
  PUBLIC SECTION.
    DATA msg1 TYPE String. "子类属性
    "静态构造重定义
    CLASS-METHODS:class_constructor.  "除了静态构造可以重写,不可重写其他静态方法。
    "实例构造,不能被重写,因为构造方法不能继承,
    METHODS:constructor IMPORTING msg TYPE String OPTIONAL
                                  msg1 TYPE String OPTIONAL.
ENDCLASS.

"子类实现
CLASS child_class IMPLEMENTATION.
  METHOD class_constructor.
    WRITE:/ '子类静态构造'.
  ENDMETHOD.

  METHOD constructor.
    WRITE:/ msg.
    WRITE:/ '子类实例构造'.
    "子类如果自定义实例构造,必须先调用父类constructor,将父类初始化
    CALL METHOD super->constructor
                EXPORTING
                  msg = '子类调用父类实例构造方法'.
    me->msg1 = msg1.
    WRITE:/ '子类初始化'.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  DATA child_obj TYPE REF TO child_class. "创建子类引用
  CREATE OBJECT child_obj.  "创建子类对象

7、接口定义与实现

    使用Interface关键字字定义接口。

语法:Interface.

        定义方法、变量.

      endinterface.

示例:

"接口定义
INTERFACE inter.
  "接口没有可见性设定,所有方法,属性都是public
  METHODS: message IMPORTING msg TYPE String OPTIONAL.
  DATA:str TYPE String.
  "常量定义,接口属性不能用value给值,常量可以
  CONSTANTS:cons TYPE String VALUE '常量'.
ENDINTERFACE.

"接口不能使用inheriting from继承,
CLASS c1 DEFINITION.
   PUBLIC SECTION.
    METHODS:output.
    "直接在类定义 public中声明使用接口,
    "使用 ALIASES  FOR 为接口中组件赋别名
    INTERFACES:inter.
    ALIASES message0 FOR inter~message.
 ENDCLASS.

 CLASS c1 IMPLEMENTATION.
   METHOD:message0.
     WRITE:/ msg.
   ENDMETHOD.

   METHOD:output.
     WRITE:/ 'test'.
   ENDMETHOD.
 ENDCLASS.

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

CLASS c2 IMPLEMENTATION.
  METHOD inter~message.
    WRITE:/ msg.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  DATA inter_obj TYPE REF TO inter.  "定义接口引用
  DATA c1_obj TYPE REF TO c1.        "定义c1类引用
  DATA c2_obj TYPE REF TO c2.        "定义c2类引用

  CREATE OBJECT: c1_obj,c2_obj.    "创建类实例
  inter_obj = c1_obj.
  inter_obj->message('c1调用接口').
*  inter_obj->output( ). "调用失败,因为c1新定义组件对接口是不可见的
  inter_obj = c2_obj.
  inter_obj->message('c2调用接口').

  "调用method写法
*  CALL METHOD inter_obj->message('c2调用接口').
*  CALL METHOD inter_obj->message
*                EXPORTING
*                 msg = 'c2调用接口'.
*  "传入多个参数
*  "inter_obj->message(p1 = '' p2 = '' …………).

 

posted @ 2019-12-03 20:23  渔歌晚唱  阅读(3503)  评论(1编辑  收藏  举报