二维码

[面向对象] ABAP面向对象中的事件

Twilight发表于 2016-04-21 15:01Twilight 最后回复于 2016-04-21 15:01 [复制链接] 2883 0

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

请勿混淆面向对象的编程中的事件和ABAP运行时系统中的事件(LOAD-OF-PROGRAM、START-OF-SELECTION等)。同时请勿将其与背景处理或工作流控制混淆。

看个实例
场景:一个产品当改变价格时,需要通知多个客户,价钱已更改,另外由日志类记录日志
  1. CLASS lcl_product DEFINITION.
  2.   PUBLIC SECTION.
  3.     EVENTS: pricechanged.
  4.     METHODS:raise_event.
  5.   PRIVATE SECTION.
  6.     DATA: price TYPE i.
  7. ENDCLASS. "lcl_product DEFINITION
  8. CLASS lcl_product IMPLEMENTATION.
  9.   METHOD raise_event.
  10.     WRITE: / '------------------------------------'.
  11.     WRITE: / 'Before event trrigger'.
  12.     RAISE EVENT pricechanged.
  13.     WRITE: / 'After event trrigger'.
  14.     WRITE: / '------------------------------------'.
  15.   ENDMETHOD. "raise_event
  16. ENDCLASS. "lcl_product IMPLEMENTATION

  17. *----------------------------------------------------------------
  18. * CLASS lcl_customer
  19. *----------------------------------------------------------------
  20. CLASS lcl_customer DEFINITION.
  21.   PUBLIC SECTION.
  22.     METHODS:
  23.       handle_price_changed FOR EVENT pricechanged OF lcl_product
  24.         IMPORTING sender.
  25. ENDCLASS. "lcl_customer DEFINITION
  26. CLASS lcl_customer IMPLEMENTATION.
  27.   METHOD handle_price_changed.
  28.     WRITE: / ' Customer handle changed price'.
  29.   ENDMETHOD. "handle_price_changed
  30. ENDCLASS. "lcl_customer IMPLEMENTATION
  31. *----------------------------------------------------------------
  32. * CLASS lcl_logger
  33. *----------------------------------------------------------------
  34. CLASS lcl_logger DEFINITION.
  35.   PUBLIC SECTION.
  36.     METHODS:
  37.       handle_price_changed FOR EVENT pricechanged OF lcl_product
  38.         IMPORTING sender.
  39. ENDCLASS. "lcl_logger DEFINITION
  40. CLASS lcl_logger IMPLEMENTATION.
  41.   METHOD handle_price_changed.
  42.     WRITE: / ' Logger log changed price'.
  43.   ENDMETHOD. "handle_price_changed
  44. ENDCLASS. "lcl_logger IMPLEMENTATION

  45. DATA:grf_product TYPE REF TO lcl_product.
  46. DATA:grf_customer TYPE REF TO lcl_customer.
  47. DATA:grf_logger TYPE REF TO lcl_logger.

  48. START-OF-SELECTION.
  49. * Create object instances
  50.   CREATE OBJECT grf_product.
  51.   CREATE OBJECT grf_customer.
  52.   CREATE OBJECT grf_logger.
  53. * Register event
  54.   SET HANDLER grf_customer->handle_price_changed FOR grf_product.
  55.   SET HANDLER grf_logger->handle_price_changed FOR grf_product.
  56. * Trigger event
  57.   grf_product->raise_event( ).
复制代码

执行结果:
event.jpg
很美妙的事情,我们并不需要直接发送消息给客户,日志类,就可以让他们知道价格已更改,从而使代码松耦合。
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表