在类中定义事件,然后在其他部分触发该事件
事件可以在类或接口中进行声明.
语法:
EVENTS|CLASS-EVENTS evt EXPORTING VALUE(e) TYPE ty.
EXPORTING
使用来指定该事件的参数
VALUE(E)
e表示参数名 ,ty 就是参数类型.
注意:事件的参数参数传递方式恒为值传递
如果没有参数需要声明的话:
EVENTS|CLASS-EVENTS evt .
分为实例事件和静态事件,
实例事件可以被任何方法触发,
静态事件的只能被静态方法触发.
语法:
RAISE EVENT evt | EXPORTING e = f....
事件需要方法来捕获处理,
首先定义一个事件处理的方法(该方法也称为:事件处理器
)
然后在运行期间为该事件注册.
实例事件处理器定义:
METHODS|CLASS-METHODS meth_name FOR EVENTS evt_name OF class_name IMPORTING e....
一个事件处理方法的接口中只能包含定义在事件evt中的形参,并遵守事件中的参数类型,但事件处理方法不需要使用所有的RAISE EVENTS
中定义的参数.
如果某个类型中定义个事件处理器,原则上就需要对其进行处理.
事件处理器能够及时响应,必须在运行时为相关事件注册方法.
SET HANDLER h [FOR]..
该语句将处理方法和触发方法进行连接,其语法效果部分取决于事件的类型
主要有四种事件类型:
FOR
时可以指定一个目标对象单独触发或者是对所有目标对象进行触发SET HANDLER h FOR ref."单一触发
SET HANDLER h FOR ALL INSTANCES."全部触发
当在静态事件中,则不可以使用FOR
SET HANDLER h....
在程序执行到RAISE EVENTS
语句之后,所有已经注册好的方法,将在下一个语句之前处理,目前事件最多嵌套64级.
要是一个对象的事件处理器能够捕获另一个对象触发事件,必须使用SET HANDLER
语句进行处理,这个注册形成了触发对象和响应对象之间的对应关系.
*&---------------------------------------------------------------------*
*& 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.