FavoriteLoading
0

ABAP面向对象(Object Orientation)编程8-类的事件(event)

[隐藏]

1, 事件

事件(event)是除去属性, 方法之外的第三类成员. 这三种组件中, 属性用于刻画类对象的状态, 方法用于访问或修改对象状态, 而事件则用于一个类对象发布其状态的改变, 因而其他对象可以捕获该方法并作出响应.
在ABAP Object 中, 事件的触发和处理是通过特定的方法进行的, 一个方法作为触发者触发事件, 而程序中的另一个方法则作为处理者捕获并处理该事件, 处理方法在事件出现进被执行.

2, 声名事件

事件可以在类或接口的声名部分进行声明.

声明该事件时, 可以使用 EXPORTING 附加项指定需要向事件处理方法中传递的参数, 该参数传递方法恒为值传递. 实例事件总是包含一个隐含的参数 SENDER, 该参数的类型为触发事件的类或接口的对象引用.

3, 触发事件

一个实例事件可以被类中的任意方法触发, 静态事件则可以被静态方法触发.
对于每一个没有被指定 OPTIONAL 项的形参 ei, 均必须在实例方法中传递一个实参 fi, 自身引用 ME 对象在被默认的传递到隐含参数 SENDER.

4, 事件处理方法

事件需要通过方法捕获事件并进行处理, 必须首先为该事件定义一个事件处理方法, 然后在运行时为该事件进行注册.

4.1 声明事件处理方法

任何类都可以为其它类中定义的事件进行处理, 同时也可以为自身事件进行处理.
实例事件处理方法的语法格式如下:

一个事件处理方法的接口中只能包含定义在事件 evt 中的形式参数, 并需遵循事件中的参数属性设定, 但事件处理方法不需要使用所有 RAISE EVENT 中定义的参数.

4.2 注册事件处理方法

要使事件处理方法能够对事件进行响应,必须在运行时为相关事件注册该方法, 语法格式如下:
该语句将处理方法和相关的触发方法进行链接, 其语法和使用效果部分地取决于事件的类型.
  • 定义在类中的实例事件.
  • 定义在接口中的实例事件.
  • 定义在类中的静态事件.
  • 定义在接口中的静态事件.
对于实例事件, 在进行处理之前必须在注册语句中使用附加项 FOR 指定希望注册到的对象.
可以指定一个单独的对象作为事件触发者.

或者使用 FOR ALL INSTANCES 附加项为处理器注册所有可以触发该事件的实例;

该注册过程可以作用于目前尚未被创建的实例.
对于静态事件, 则不能使用 FOR 附加项;

该注册自动应用于整个类, 对于接口中的静态事件, 该注册可以应用于目前尚未装载至内在中的类.

4.3 事件处理时间

在程序执行到 RAISE EVENT 语句之后, 所有已注册的处理方法都将在下一个语句之前被处理. 如果处理方法本身触发事件, 则该处理方法在原方法继续执行之前被重新调用. 

4.4 事件的触发及处理

事件的触发和处理基本过程如下: 假设有两个类 C1 和 C2, C1中包含事件 E1, 而该事件可能在方法 M1 中通过 RAISE EVENT 语句被触发, 而 C2 中将包含方法 M2, 该方法可以捕获事件 E1, 并进行处理.
在实际操作时, 要使一个对象的事件处理方法能够捕获另一个对象触发事件, 必须先使用 SET HANDLER 语句进行注册, 这个注册过程中形成了触发对象和响应对象之间的对应关系
7c7b1600gd3d81a0d81bc&690
当然, 也可以同时注册多个处理对象与一个触发对象相对应.
SET HANDLER 语句则创建一个系统内部的事件处理表, 为每一个事件注册相应的方法. 该表为系统隐含. 对于实例事件, 事件处理表中包含用于实现处理的方法名称以及注册了的类实例引用, 该表通过 SET HANDLER 语句动态的进行维护. 对于静态事件, 系统为相关类创建一个实例无关的处理表. 一旦事件被触发, 系统将查找相关的事件表并执行对应于该事件的实例方法.

5, 例子程序

运行结果:

2017-03-07_14-01-13

以上。