ABAP 快速入门之 ABAP 面向对象

287 阅读2分钟

类定义

ABAP 类可以全局或局部声明。全局类可以被 ABAP 存储库中的任何对象使用。相比之下,局部类只能在其声明的范围内使用。例子如下:

CLASS lcl_abap_class DEFINITION.
  PUBLIC SECTION.
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.

CLASS lcl_abap_class IMPLEMENTATION.
ENDCLASS.

局部类的构造函数、方法定义与实现:

CLASS lcl_abap_class DEFINITION.
  PUBLIC SECTION.
    METHODS: constructor,
             method1.
  PROTECTED SECTION.
  
  PRIVATE SECTION.
    METHODS: method2,
             method3.
ENDCLASS.

CLASS lcl_abap_class IMPLEMENTATION.
    METHOD constructor.
        "Logic
    ENDMETHOD.

    METHOD method1.
        "Logic
    ENDMETHOD.

    METHOD method2.
        "Logic
        method3( ).
    ENDMETHOD.

    METHOD method3.
        "Logic
    ENDMETHOD.
ENDCLASS.

旧的方法调用:

DATA lo_abap_class TYPE REF TO lcl_abap_class.

CREATE OBJECT lo_abap_class. "Constructor call

lo_abap_class->method1( ).

推荐使用新的方法调用:

DATA(lo_abap_class) = NEW lcl_abap_class( ).
lo_abap_class->method1( ).

或者:

DATA lo_abap_class TYPE REF TO lcl_abap_class.
lo_abap_class = NEW #( ).
lo_abap_class->method1( ).

继承 - 抽象和 Final 方法和类

METHODSCLASS 语句中的 ABSTRACTFINAL 添加允许您定义抽象和 Final 方法或类。

抽象方法是在抽象类中定义的,并且不能在该类中实现。相反,它是在该类的子类中实现的。抽象类不能被实例化。

Final 方法不能在子类中重新定义。Final 类不能有子类。

类实现:

CLASS lcl_abstract DEFINITION ABSTRACT.
    PUBLIC SECTION.
        METHODS: abstract_method ABSTRACT,
                 final_method FINAL
                 normal_method.
                
ENDCLASS.

CLASS lcl_abstract IMPLEMENTATION.
    METHOD final_method.
        "This method can't be redefined in child class!
    ENDMETHOD.

    METHOD normal_method.
        "Some logic
    ENDMETHOD.

        "We can't implement abstract_method here!

ENDCLASS.

CLASS lcl_abap_class DEFINITION INHERITING FROM lcl_abstract.
    PUBLIC SECTION.
        METHODS: abstract_method REDEFINITION,
                 abap_class_method.
ENDCLASS.

CLASS lcl_abap_class IMPLEMENTATION.
    METHOD abstract_method.
        "Abstract method implementation
    ENDMETHOD.

    METHOD abap_class_method.
        "Logic
    ENDMETHOD.
ENDCLASS.

方法调用:

DATA(lo_class) = NEW lcl_abap_class( ).

lo_class->abstract_method( ).
lo_class->normal_method( ).
lo_class->abap_class_method( ).
lo_class->final_method( ).

继承定义

继承允许你从现有的类派生出一个新类。要做到这一点,需要使用 CLASS subclass DEFINITION INHERITING FROM superclass. 语句。新类子类继承现有类超类的所有组件。新类称为派生类的子类。原来的类称为新类的超类。一个类可以有多个直接子类,但只能有一个直接超类。

类继承

CLASS lcl_vehicle DEFINITION.
ENDCLASS.

CLASS lcl_vehicle IMPLEMENTATION.
ENDCLASS.

CLASS lcl_car DEFINITION INHERITING FROM lcl_vehicle.
ENDCLASS.

CLASS lcl_car IMPLEMENTATION.
ENDCLASS.

带参数的方法(Importing, Changing, Exporting)

带参数的类定义与类实现:

CLASS lcl_abap_class DEFINITION.
  PRIVATE SECTION.
    METHODS method1 IMPORTING iv_string TYPE string
                     CHANGING cv_string TYPE string
                    EXPORTING ev_string TYPE string.
ENDCLASS.

CLASS lcl_abap_class IMPLEMENTATION.
    METHOD method1.
        cv_string = iv_string.
        ev_string = 'example'.
    ENDMETHOD.
ENDCLASS.

方法调用:

method1 (
  EXPORTING iv_string = lv_string
  IMPORTING ev_string = lv_string2
  CHANGING cv_string = lv_string3
).

带返回参数的方法

类实现:

CLASS lcl_abap_class DEFINITION.
  PRIVATE SECTION.
    METHODS method1 RETURNING VALUE(rv_string) TYPE string.
ENDCLASS.

CLASS lcl_abap_class IMPLEMENTATION.
    METHOD method1.
        rv_string = 'returned value'.
    ENDMETHOD.
ENDCLASS.

方法调用:

lv_string = method1( ).

请注意,使用 RETURNING 声明的参数仅支持按值传递