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

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

SAP ABAP 事件
SAP ABAP OOP

1.定义事件

1.1声明事件

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

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

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

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

EVENTS|CLASS-EVENTS  evt .

1.2触发事件

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

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

2.事件处理方法

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

2.1声明事件处理方法

实例事件处理器定义:

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

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

2.2注册时间处理方法

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

SET HANDLER h  [FOR]..

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

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

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

SET HANDLER h....

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.

5.显示结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨天行舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值