Übung Schrödinger: 08 Klassen lokal (ABAP)

Beispielklasse aus dem Buch Schrödinger programmiert ABAP für die Definition von lokalen klassen.

REPORT zsch_matt_cmachine.

CLASS lcl_wasserbehaelter DEFINITION.
  " Öffentlich sichtbar
  PUBLIC SECTION.
    CONSTANTS: gc_wasser_haerte_grenze TYPE f VALUE 14.
    " METHODS get_wasserstand EXPORTING ed_wasserstand TYPE i.
    METHODS get_wasserstand
    RETURNING value(rd_wasserstand) TYPE i.
    METHODS set_wasserstand
    IMPORTING value(id_wasserstand) TYPE i.
    METHODS check_wasser_haerte.

    " Nur für Vererbung sichtbar
  PROTECTED SECTION.

    " Nur privat sichtbar
  PRIVATE SECTION.
    DATA: gd_wasserstand TYPE i,
          gd_wasser_haerte TYPE f.

ENDCLASS.

CLASS lcl_wasserbehaelter IMPLEMENTATION.
  METHOD get_wasserstand.
    rd_wasserstand = me->gd_wasserstand.
  ENDMETHOD.

  METHOD set_wasserstand.
    me->gd_wasserstand = id_wasserstand.
  ENDMETHOD.

  METHOD check_wasser_haerte.
    IF me->gd_wasser_haerte > gc_wasser_haerte_grenze.
      MESSAGE 'AU, das tut weh!' TYPE 'I'.
    ENDIF.
  ENDMETHOD.
ENDCLASS.


CLASS lcl_kaffeevollautomat DEFINITION.
  PUBLIC SECTION.
    CLASS-DATA: anz_kva TYPE i.
    CLASS-METHODS: class_constructor.
    CLASS-METHODS: erhoehe_anz_kva.

    METHODS: constructor.
    METHODS: ein_kaffee_sil_vous_plait
    IMPORTING
      value(id_expresso) TYPE abap_bool OPTIONAL
      value(id_verlaengerter) TYPE abap_bool OPTIONAL.
    METHODS: bohne_nachfuellen
    IMPORTING
      ir_bohne TYPE REF TO zcl_matt_cbean.
    METHODS: on_loaded FOR EVENT loaded OF zcl_matt_cbeanbox.

  PRIVATE SECTION.
    DATA: gd_wasserstand TYPE i,
          gr_wasserbehaelter TYPE REF TO lcl_wasserbehaelter,
          gr_bohnenbehaelter TYPE REF TO zcl_matt_cbeanbox.
ENDCLASS.

CLASS lcl_kaffeevollautomat IMPLEMENTATION.
  METHOD class_constructor.
  ENDMETHOD.

  METHOD constructor.
    CALL METHOD erhoehe_anz_kva.
    CREATE OBJECT me->gr_wasserbehaelter.
    me->gr_wasserbehaelter->set_wasserstand( id_wasserstand = 1000 ).

    CREATE OBJECT me->gr_bohnenbehaelter.
    " Events vom Bohnenbehälter im KVA registrieren
    SET HANDLER me->on_loaded FOR me->gr_bohnenbehaelter.
  ENDMETHOD.

  METHOD ein_kaffee_sil_vous_plait.
  ENDMETHOD.

  METHOD erhoehe_anz_kva.
    " Verschiedene Arten auf statische Attribute zuzugreifen:
    anz_kva = anz_kva + 1.
    lcl_kaffeevollautomat=>anz_kva = lcl_kaffeevollautomat=>anz_kva - 1.
    ADD 1 TO lcl_kaffeevollautomat=>anz_kva.
  ENDMETHOD.

  METHOD bohne_nachfuellen.
    me->gr_bohnenbehaelter->insert_bean( ir_cbean = ir_bohne ).
  ENDMETHOD.

  METHOD on_loaded.
    "MESSAGE 'Bohnenbehälter ist voll.' TYPE 'I'.
  ENDMETHOD.

ENDCLASS.

" Objektreferenz ist eine Variable, die die Speicheradresse
" eines Objekts enthält.
" Variablen, die Objekte enthalten, können nur als Objektreferenz
" angelegt werden.

" Deklaration einer Objektreferenz vom Objekttyp lcl_kaffeevollautomat
DATA: gr_kva_zuhause TYPE REF TO lcl_kaffeevollautomat,
      gr_kva_arbeit TYPE REF TO lcl_kaffeevollautomat,
      gr_arabica_bohne TYPE REF TO zcl_matt_cbean,
      gd_zubereitungsart TYPE char40.

START-OF-SELECTION.

  " Objektinstanzierung
  CREATE OBJECT gr_kva_zuhause.
  CREATE OBJECT gr_kva_arbeit.

  DO 7150 TIMES.
    CREATE OBJECT gr_arabica_bohne.
    gr_kva_zuhause->bohne_nachfuellen( ir_bohne = gr_arabica_bohne ).
  ENDDO.