从book学习ABAP,我了解了对象/类事件。我知道其他语言(例如C#/ WinForms)的事件是GUI中用户操作(例如按钮单击)与交互后执行的一些代码之间的连接。也有可能通过代码触发此类事件以模拟用户操作,这有时会很有用。
本书以RAISE EVENT
语句结尾的示例从代码中手动触发了事件。在线上的其他来源(例如1,2,3,4,5)也是如此。如果我可以直接调用对象方法,则没有任何理由引发代码事件。在我看来,这似乎是不必要的代码层。在ABAP中使用事件的目的或好处是什么?我想念什么?
答案 0 :(得分:1)
感谢您的评论;他们让我走上了正轨。许多来源的问题在于它们显示了一个非常简单的示例,其中事件没有带来任何好处。 这与在几行代码中使用OOP或使用递归而不是简单的循环相同。这样简单的示例可以很好地学习语法,但不足以理解目的或好处。 >
在一类中使用事件和处理程序对我来说没有多大意义。大多数示例都带有两个类(仍然将可以单独使用的东西放在一起)。对我而言,包含三个独立代码段的示例带来了最大的好处。据我了解,关键点是:
EVENTS
定义的事件。 A类不需要引用其他类。用我的话说:内部可能发生一些其他情况有趣的情况。该班级不了解外部世界(没有依赖性),但是可以向世界表明情况已发生。RAISE EVENT
从其内部代码引发(触发,触发)事件。用我的话说:情况发生在外面(向所有可能关注和订阅的人广播)。METHODS - FOR EVENT – OF
为A类定义方法/处理程序。此类需要了解A类及其事件。用我的话来说:B类提供了处理A类中可能发生的情况的代码。SET HANDLER - FOR
使用此处理程序。最重要的是,它也可以是不同于B的其他类的另一个处理程序。用我的话说:当使用A类时,我可以通过从A不知道的一系列合适的处理程序中进行选择,轻松设置在A发生这种情况后将发生的情况。因为我想念一个很好的例子,所以在这里说明了要点:
CLASS lcl_class_a DEFINITION.
PUBLIC SECTION.
DATA a1 TYPE I.
EVENTS: my_event.
METHODS: method_raising_event.
ENDCLASS.
CLASS lcl_class_a IMPLEMENTATION.
METHOD method_raising_event.
"some working code would be here
RAISE EVENT my_event.
ENDMETHOD.
ENDCLASS.
CLASS lcl_class_b DEFINITION.
PUBLIC SECTION.
"This methods could be run after the event.
METHODS: handle_event1 FOR EVENT my_event OF lcl_class_a,
handle_event2 FOR EVENT my_event OF lcl_class_a.
ENDCLASS.
CLASS lcl_class_b IMPLEMENTATION.
METHOD handle_event1.
WRITE: / 'Event in class raised'.
ENDMETHOD.
METHOD handle_event2.
" Some code, e.g. logging to a file.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(object_a) = new lcl_class_a( ).
DATA(object_b) = new lcl_class_b( ).
"Binding event and handler.
SET HANDLER object_b->handle_event1 FOR object_a.
CALL METHOD object_a->method_raising_event.
添加项:
当了解某些设计模式时,目的或好处会更加清晰。有人提到了一些好处。我会遵循从一般到特殊的这种层次结构:
很高兴阅读对我的答案的评论。