• SAP ABAP 定义事件以及处理事件


    在类中定义事件,然后在其他部分触发该事件

    SAP ABAP 事件
    SAP ABAP OOP

    1.定义事件

    1.1声明事件

    事件可以在类或接口中进行声明.
    语法:

    EVENTS|CLASS-EVENTS  evt EXPORTING VALUE(e) TYPE ty. 
    
    • 1

    EXPORTING 使用来指定该事件的参数
    VALUE(E) e表示参数名 ,ty 就是参数类型.
    注意:事件的参数参数传递方式恒为值传递

    如果没有参数需要声明的话:

    EVENTS|CLASS-EVENTS  evt .
    
    • 1

    1.2触发事件

    分为实例事件和静态事件,
    实例事件可以被任何方法触发,
    静态事件的只能被静态方法触发.
    语法:

    RAISE EVENT evt | EXPORTING e = f....
    
    • 1

    2.事件处理方法

    事件需要方法来捕获处理,
    首先定义一个事件处理的方法(该方法也称为:事件处理器)
    然后在运行期间为该事件注册.

    2.1声明事件处理方法

    实例事件处理器定义:

    METHODS|CLASS-METHODS meth_name FOR EVENTS evt_name OF class_name IMPORTING e....
    
    • 1

    一个事件处理方法的接口中只能包含定义在事件evt中的形参,并遵守事件中的参数类型,但事件处理方法不需要使用所有的RAISE EVENTS中定义的参数.
    如果某个类型中定义个事件处理器,原则上就需要对其进行处理.

    2.2注册时间处理方法

    事件处理器能够及时响应,必须在运行时为相关事件注册方法.

    SET HANDLER h  [FOR]..
    
    • 1

    该语句将处理方法和触发方法进行连接,其语法效果部分取决于事件的类型
    主要有四种事件类型:

    1. 类中实例事件
    2. 接口实例事件
    3. 类中静态事件
    4. 接口静态事件
      当在实例事件中使用FOR时可以指定一个目标对象单独触发或者是对所有目标对象进行触发
    SET HANDLER h FOR ref."单一触发
    SET HANDLER h FOR ALL INSTANCES."全部触发
    
    • 1
    • 2

    当在静态事件中,则不可以使用FOR

    SET HANDLER h....
    
    • 1

    2.3事件处理时间

    在程序执行到RAISE EVENTS语句之后,所有已经注册好的方法,将在下一个语句之前处理,目前事件最多嵌套64级.

    3.事件的触发以及处理

    要是一个对象的事件处理器能够捕获另一个对象触发事件,必须使用SET HANDLER语句进行处理,这个注册形成了触发对象和响应对象之间的对应关系.

    在这里插入图片描述

    4.代码实现

    *&---------------------------------------------------------------------*
    *& Report Z_CLASS_COUNTER_EVENT
    *&---------------------------------------------------------------------*
    *&
    *&---------------------------------------------------------------------*
    REPORT z_class_counter_event.
    CLASS vehicle DEFINITION INHERITING FROM object.
      PUBLIC SECTION.
        EVENTS:too_fast. "事件
        METHODS:accelerate,show_speed.
      PROTECTED SECTION.
        DATA:speed TYPE i.
    ENDCLASS.
    
    CLASS vehicle IMPLEMENTATION.
      METHOD accelerate.
        speed  = speed + 1.
        IF speed > 5.
          RAISE EVENT too_fast. "满足条件 触发事件
          speed = 5.
        ENDIF.
      ENDMETHOD.
    
      METHOD show_speed.
        WRITE:/ 'speed', speed.
      ENDMETHOD.
    ENDCLASS.
    
    CLASS handler DEFINITION.
      PUBLIC SECTION.
    "监听事件:监听vehicle类中的too_fast事件,并使用方法handle_excess处理事件
        METHODS handle_excess
            FOR EVENT too_fast OF vehicle. 
    ENDCLASS.
    
    CLASS handler IMPLEMENTATION .
      METHOD handle_excess.
        WRITE: / 'speed can not be too_fast'.
      ENDMETHOD.
    ENDCLASS.
    
    DATA: o_vehicle TYPE REF TO vehicle,
          o_handle  TYPE REF TO handler.
    
    START-OF-SELECTION.
      CREATE OBJECT : o_handle, o_vehicle.
    *  执行o_handle对象下handle_excess方法中的所有事件.
      SET HANDLER o_handle->handle_excess FOR ALL INSTANCES.
               
    
      DO 11 TIMES.
        CALL METHOD o_vehicle->accelerate.
        CALL METHOD o_vehicle->show_speed.
      ENDDO.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    5.显示结果

    在这里插入图片描述

  • 相关阅读:
    day24-selenium基本操作
    mfoc-hardnested在visual studio2022编译
    区块链基本概念学习笔记
    Python 最好用的8个VS Code扩展
    【JavaScript】内置数学对象、日期对象学习笔记
    QTTabBar在重置Internet Explorer后失效
    Agent 与对象的辨析
    高级运维学习(十五)Zabbix监控(二)
    0.Linux环境搭建
    报错AttributeError: Attempted to set WANDB to False, but CfgNode is immutable
  • 原文地址:https://blog.csdn.net/weixin_49198221/article/details/126604019