Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop ABAP活动的目的是什么?_Oop_Events_Abap - Fatal编程技术网

Oop ABAP活动的目的是什么?

Oop ABAP活动的目的是什么?,oop,events,abap,Oop,Events,Abap,从a学习ABAP,我开始学习对象/类事件。我知道其他语言(如C#/WinForms)中的事件是GUI中的用户操作(如按钮单击)与交互后执行的某些代码之间的连接。也有可能从代码中触发此类事件以模拟用户操作,这有时很有用 本书以raiseevent语句结束示例,该语句从代码手动触发事件。在其他在线来源(例如,,)中也是如此。如果我可以直接调用object方法,我看不出有任何理由从代码中引发事件。对我来说,这似乎是不必要的代码层。在ABAP中使用事件的目的或好处是什么?我错过了什么?谢谢你的评论;他们

从a学习ABAP,我开始学习对象/类事件。我知道其他语言(如C#/WinForms)中的事件是GUI中的用户操作(如按钮单击)与交互后执行的某些代码之间的连接。也有可能从代码中触发此类事件以模拟用户操作,这有时很有用


本书以
raiseevent
语句结束示例,该语句从代码手动触发事件。在其他在线来源(例如,,)中也是如此。如果我可以直接调用object方法,我看不出有任何理由从代码中引发事件。对我来说,这似乎是不必要的代码层。在ABAP中使用事件的目的或好处是什么?我错过了什么?

谢谢你的评论;他们让我走上了正确的道路。许多资料来源的问题在于,它们显示了一个非常简单的例子,事件并没有带来任何好处。这与对几行代码使用OOP相同,或者使用递归代替简单循环。这样简单的例子有助于学习语法,但不足以理解其目的或好处

在一个类中使用事件和处理程序对我来说没有多大意义。大多数示例都有两个类(仍然将可以单独使用的东西放在一起)。对我来说,一个包含三段独立代码的示例带来了最大的好处。据我了解,重点是:

  • A类有一个由命令
    EVENTS
    定义的事件。类A不需要引用其他类。用我的话说:一些对其他人来说有趣的情况可能发生在内部。该类不了解外部世界(没有依赖性),但它可以向世界发出发生这种情况的信号
  • 只有对象A可以通过命令
    raise event
    从其内部代码引发(激发、触发)事件。用我的话来说:这种情况是在外面(向任何可能关心和订阅的人)广播的
  • 类B通过可用于处理事件的命令
    方法-for EVENT–OF
    定义类A的方法/处理程序。这个类需要知道类A及其事件。用我的话说:类B提供了处理类A中可能出现的情况的代码
  • 了解这两个类(可能是创建它们)的第三段代码说:当类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.
    
    补充:

    • 在实际场景中,在类B(处理程序)的对象中引用类A(raiser)的对象是很有用的。您可能需要从A类获得有关该事件的附加信息,但这不是必需的
    • 可以将多个处理程序附加到一个事件
    当了解一些设计模式时,其目的或好处会更加清楚。在福利中提到了一些。我会按照从一般到特殊的层次结构:

  • 坚实的
  • 松耦合/解耦/问题分离
  • 依赖倒置原理
  • 观察者-可观察者/订阅者-发布者

  • 很高兴阅读关于我答案的评论。

    -同样的问题,请阅读答案
    引发事件
    不是SAP GUI中的用户操作所特有的,它是面向对象编程语言中事件的概念,用于松耦合、关注点分离等。@JozsefSzikszai,老实说,这些链接上没有提供太多答案,只有低耦合:)听到更广泛的内容会很有趣。@Suncatcher:对不起,这是第一个答案。它很好地解决了jcjr“面向对象中的事件”提出的问题,也实现了。它可以在类之外,但大多数情况下,
    设置处理程序
    与处理程序方法在同一个类中(
    METHODS…FOR EVENT…OF…