[ABAP] OO: Statischer Konstruktor, Instanzkonstruktor, statischer und dynamischer Methodenaufruf

* Einfache Klasse für Demo des statischen Konstruktors und des Instanzkonstruktors
* sowie eines statischen und dynamischen Methodenaufrufs
CLASS lcl_demo DEFINITION.
  PUBLIC SECTION.
* Instanzkonstruktor
    METHODS:
      constructor.

* funktionale Instanzmethode, gibt Ergebnis zurück
    METHODS:
      add
        IMPORTING
                  i_var1        TYPE i
                  i_var2        TYPE i
        RETURNING VALUE(rv_erg) TYPE i.

    CLASS-METHODS:
* statischer Konstruktor
      class_constructor.

* statische funktionale Methode, gibt Ergebnis zurück
    CLASS-METHODS:
      mul
        IMPORTING
                  i_var1        TYPE i
                  i_var2        TYPE i
        RETURNING VALUE(rv_erg) TYPE i.
ENDCLASS.

CLASS lcl_demo IMPLEMENTATION.
  METHOD class_constructor.
    WRITE: / 'statischer Konstruktor'.
  ENDMETHOD.

  METHOD constructor.
    WRITE: / 'dynamischer Konstruktor'.
  ENDMETHOD.

  METHOD add.
    rv_erg = i_var1 + i_var2.
  ENDMETHOD.

  METHOD mul.
    rv_erg = i_var1 * i_var2.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.

* erster Aufruf einer Methode der Klasse lcl_demo durch den Aufruf von mul( )
* -> ruft den Klassenkonstruktor, danach erst wird mul( ) statisch prozessiert
  WRITE: / lcl_demo=>mul( i_var1 = 4 i_var2 = 3 ).

* Objekt der Klasse lcl_demo erzeugen
  DATA(o_ref) = NEW lcl_demo( ).
* Methode add( ) aurufen
  WRITE: / o_ref->add( i_var1 = 2 i_var2 = 3 ).
* Methode mul( ) dynamisch prozessieren
  WRITE: / o_ref->mul( i_var1 = 2 i_var2 = 3 ).

[ABAP] OO: Instanzkonstruktor, funktionale Instanzmethode, Exceptionhandling

* Einfache Klasse für Demo des Konstruktors, Instanzmethode, Exceptionhandling
CLASS lcl_demo DEFINITION.
  PUBLIC SECTION.
* Instanzkonstruktor mit Übergabeparameter
* Propagiert Exception vom Typ cx_sy_create_object_error
    METHODS:
      constructor
        IMPORTING
          i_name TYPE string
        RAISING
          cx_sy_create_object_error.

* funktionale Instanzmethode, gibt Namen zurück
    METHODS:
      get_name RETURNING VALUE(rv_name) TYPE string.

  PRIVATE SECTION.
* globale, private Variable zur Speicherung des Namens
    DATA: gv_name TYPE string.
ENDCLASS.

CLASS lcl_demo IMPLEMENTATION.
  METHOD constructor.
* prüfen, ob Name leer
    IF i_name = ''.
* Exception werfen
      RAISE EXCEPTION TYPE cx_sy_create_object_error.
    ELSE.
      gv_name = i_name.
    ENDIF.
  ENDMETHOD.

  METHOD get_name.
* Namen zurückgeben
    rv_name = gv_name.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
* Exception provozieren
  TRY.
      DATA(o_ref) = NEW lcl_demo( i_name = '' ).

      WRITE: / o_ref->get_name( ).

    CATCH cx_sy_create_object_error INTO DATA(e_txt).
      WRITE: / e_txt->get_text( ).
  ENDTRY.
  
* "normale" Abarbeitung
  TRY.
      DATA(o_ref) = NEW lcl_demo( i_name = 'Test' ).

      WRITE: / o_ref->get_name( ).

    CATCH cx_sy_create_object_error INTO DATA(e_txt).
      WRITE: / e_txt->get_text( ).
  ENDTRY.

[ABAP] OO: Events auslösen, Eventhandling

* Demo-Objekt, welches ein Event definiert und auslöst
CLASS lcl_demo DEFINITION.
  PUBLIC SECTION.
* der Event, der getriggert werden soll
    EVENTS:
      my_event
        EXPORTING
          VALUE(txt) TYPE string
          VALUE(val) TYPE i.

* Instanzkonstruktor mit Übergabeparameter
    METHODS:
      constructor
        IMPORTING
          iv_name TYPE string.

* die Methode, die den Event auslöst
    METHODS: write.

* gibt Namen zurück
    METHODS: get_name
      RETURNING VALUE(rv_name) TYPE string.

* Variable zum Speichern des Namens
  PRIVATE SECTION.
    DATA: gv_name TYPE string.
ENDCLASS.

CLASS lcl_demo IMPLEMENTATION.
* Instanzkonstruktor mit Übergabeparameter
  METHOD constructor.
    gv_name = iv_name.
  ENDMETHOD.
* die Methode, die den Event auslöst
  METHOD write.
    WRITE: / '1. lcl_demo triggert Event "my_event"'.
* Event auslösen
    RAISE EVENT my_event
      EXPORTING
        txt = 'Übergabetext'
        val = 1.
  ENDMETHOD.
* gibt Namen zurück
  METHOD get_name.
    rv_name = gv_name.
  ENDMETHOD.
ENDCLASS.

* Eventhandlerklasse, die Methoden zur Ereignisbehalndlung abbildet
CLASS lcl_eventhandler DEFINITION.
  PUBLIC SECTION.
* die Ereignisbehandlungsroutine, die mit dem Event über SET HANDLER verknüpft wird
    CLASS-METHODS: on_my_event FOR EVENT my_event OF lcl_demo
      IMPORTING
          txt
          val
          sender.
ENDCLASS.

CLASS lcl_eventhandler IMPLEMENTATION.
* die Ereignisbehandlungsroutine, die mit dem Event verknüpft wird
  METHOD on_my_event.
    WRITE: / '2. lcl_eventhandler=>on_my_event:'.
    WRITE: / '   Name:', sender->get_name( ).
    WRITE: / '    txt:', txt.
    WRITE: / '    val:', val.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
* Objekt erzeugen
  DATA(o_evt) = NEW lcl_demo( 'Aufrufer-Objekt' ).

* Handler registrieren: Zuordnung von Eventhandler "on_my_event" zu Objekt der Demo-Klasse mit Eventtrigger für my_event
  SET HANDLER lcl_eventhandler=>on_my_event FOR o_evt.

* Funktionsaufruf, welcher den Event triggert
  o_evt->write( ).

Weiterführende Infos: Link und Link