事件(EVENT)
用于捕获某类对象状态的改变来触发事件的方法,并进行处理。
事件是没有继承关系的类之间可以互相调用彼此方法的特殊方法。
当需要关联两个互不关联的类时,需要通过定义事件来实现
4种类型
定义在类中的:实例事件,静态事件
定义在接口中的:实例事件,静态事件
对于实例事件,注册语句必须使用FOR指定注册对象
… FOR ref .
… FOR ALL INSTANCES(注册所有可以触发该事件的实例,包括尚未被创建的实例)
注册静态事件,不需加FOR后缀,自动应用于整个类
当程序执行到RAISE EVENT语句后,所有已注册的处理方法都将在下一个语句之前被处理。处理方法按照其在系统内部注册的顺序被执行。为避免无限循环,目前事件处理最多不能超过64级嵌套
使用步骤
1、定义事件
定义:可以在类或接口中进行声明
EVENTS|CLASS-EVENTS evt EXPORTING … VALUE(p1)TYPE type|LIKE f [OPTIONAL|DEFAULT g] ...
例:EVENTS mod_10 EXPORTING VALUE(p_data) TYPE i.
实例事件中包含一个隐含参数SENDER,该参数的类型为触发时间的类或接口对象引用
2、触发事件
触发:一个实例事件可以被类中的任意方法触发,静态时间则可以被静态方法触发
RAISE EVENT evt EXPORTING p1 = f1 … pn = fn
例:RAISE EVENT mod_10 EXPORTING p_data = t_data .
3、接收事件/事件处理
事件处理:事件需要通过触发其声明代码中所定义的方法才能处理相关事务。
人和类都可以调用其他类中所定义的事件,或调用自身所定义的事件。
METHODS|CLASS-METHODS meth FOR EVENT evt OF cifIMPORTING …ei…
例:METHODS write_data FOR EVENT mod_10 OF cl_dataIMPORTING p_data.
4、注册事件方法
为相关事件注册方法,注册事件方法前,先创建类对象,并实例化对象
SET HANDLER … hi… [FOR] …
例:
DATA cl_event TYPE REF TO cl_data. "创建对象
DATA cl_handl TYPE REF TO lcl_handler."创建对象
CREATE OBJECT cl_handl."实例化对象
CREATE OBJECT cl_event."实例化对象
SETHANDLER cl_handl->write_data FOR cl_event. "注册事件方法
方式一:程序实现示例代码
*&---------------------------------------------------------------------*
*& Report ZTEST01
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTEST01.
*定义类的构成项目(属性、方法、事件)
* CLASS <class> DEFINITION.
* 要素声明
* 所有项目都需要定义在三个访问区域之一中
* ENDCLASS.
*实现类的方法
* CLASS <class> IMPLEMENTATION.
* ENDCLASS.
*事件是没有继承关系的类之间可以互相调用彼此方法的特殊方法
*当需要关联两个互不关联的类时,需要通过定义事件来实现
*第一个类
* 1.定义事件:
* 例: EVENTS mod_10 EXPORTING VALUE(p_data) TYPE i.
* 2.触发事件
* 例: RAISE EVENT mod_10 EXPORTING p_data = t_data .
*第二个类
* 3.接收事件:
* 例: METHODS write_data FOR EVENT mod_10 OF cl_data IMPORTING p_data.
* 4.注册类:
* CREATE OBJECT cl_handl. "实例化 第二个类
* CREATE OBJECT cl_event. "第一个类
*" SET HANDLER 实例2->方法 for 实例1 注册
* SET HANDLER cl_handl->write_data FOR cl_event.
* 5.调用
* 例: CALL METHOD cl_event->add_data.
"定义一个数字,进行1到50的循环,当为10的倍数时,进行输出
CLASS cl_data DEFINITION.
PUBLIC SECTION."公共
METHODS add_data.
EVENTS mod_10 EXPORTING VALUE(p_data) TYPE i."1.定义事件
PRIVATE SECTION."私有
DATA t_data TYPE i.
ENDCLASS.
" 实现add_data方法
CLASS cl_data IMPLEMENTATION.
METHOD add_data.
DATA gv_data TYPE i.
t_data = t_data + 1.
gv_data = t_data MOD 10."取余
IF gv_data = 0.
RAISE EVENT mod_10 EXPORTING p_data = t_data. "2.触发事件
ENDIF.
ENDMETHOD.
ENDCLASS.
CLASS lcl_handler DEFINITION.
PUBLIC SECTION.
METHODS write_data FOR EVENT mod_10 OF cl_data IMPORTING p_data. "3.接收事件
ENDCLASS.
CLASS lcl_handler IMPLEMENTATION.
METHOD write_data.
WRITE:/ p_data.
ENDMETHOD.
ENDCLASS.
DATA cl_event TYPE REF TO cl_data. "创建对象
DATA cl_handl TYPE REF TO lcl_handler."创建对象
START-OF-SELECTION.
CREATE OBJECT cl_handl."实例化
CREATE OBJECT cl_event."实例化
SET HANDLER cl_handl->write_data FOR cl_event. "4、注册事件,才能进行两个类之间的变量传值
DO 50 TIMES.
CALL METHOD cl_event->add_data.
ENDDO.
执行结果
![](https://img-blog.csdnimg.cn/img_convert/600379a64eb35466dc74f74ccb56d87e.png)
方式二:SE24创建类实现
1、创建自定义类
![](https://img-blog.csdnimg.cn/img_convert/5fb94c8b505eae2d3152a785f70a5828.png)
![](https://img-blog.csdnimg.cn/img_convert/327ca1bac13728a3fe196c35835fba02.png)
2、定义类属性
![](https://img-blog.csdnimg.cn/img_convert/ce76371fb3c38b8dfc9b0f7b43012e13.png)
3、定义类方法
![](https://img-blog.csdnimg.cn/img_convert/5a1f0ce3cb66aebfc1be8f7e804bed0c.png)
双击方法名进入编写方法内容
![](https://img-blog.csdnimg.cn/img_convert/a0fd8ca95e10f1559a4d4ca4ae8703e4.png)
4、定义类事件
![](https://img-blog.csdnimg.cn/img_convert/b39b2aba27217f9a58218889c988e7a6.png)
设置事件参数(选中事件点击参数)
![](https://img-blog.csdnimg.cn/img_convert/4504976d23b008ee2beda8263560ec4d.png)
点击【基于源代码】查看该类源码
![](https://img-blog.csdnimg.cn/img_convert/64717743315e8cd9665478acb3d0cb4a.png)
5、定义接收事件/事件处理方法
![](https://img-blog.csdnimg.cn/img_convert/7697f8943576d13db604e29f78fcc725.png)
![](https://img-blog.csdnimg.cn/img_convert/977b720b7aecdc7dbe41da7d44d8405c.png)
![](https://img-blog.csdnimg.cn/img_convert/fadec37998b0f3b44f03a91bdf4a4a63.png)
双击方法名进入编写方法内容
![](https://img-blog.csdnimg.cn/img_convert/d4fd98f44f0c78b65e2f9ed5ab9ed679.png)
为方法接收指定事件
![](https://img-blog.csdnimg.cn/img_convert/99d70aa58c6826cf2eb54bfc5e172ed6.png)
引入事件参数
![](https://img-blog.csdnimg.cn/img_convert/91b23a9c470f65db451221a9724f2252.png)
![](https://img-blog.csdnimg.cn/img_convert/32a482e5249bff9269c4210f95c19506.png)
点击【基于源代码】查看该类源码
![](https://img-blog.csdnimg.cn/img_convert/83e4fef1b4b6e2bed815819f4ce62287.png)
6、注册事件(在程序中使用时需要注册)
*&---------------------------------------------------------------------*
*& Report ZTEST02
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTEST02.
DATA cl_event TYPE REF TO zcl_test_001. "创建对象
DATA cl_handl TYPE REF TO zcl_test_002."创建对象
START-OF-SELECTION.
CREATE OBJECT cl_event."实例化
CREATE OBJECT cl_handl."实例化
" 4、注册事件,才能进行两个类之间的变量传值
SET HANDLER cl_handl->write_data FOR cl_event.
DO 50 TIMES.
CALL METHOD cl_event->add_data.
ENDDO.
执行结果
![](https://img-blog.csdnimg.cn/img_convert/0c5c921bd4432b84b9e29de8f0e2e6b9.png)