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

Aus MattWiki
Version vom 9. April 2018, 13:17 Uhr von Matt (Diskussion | Beiträge) (Matt verschob die Seite Klasse lokal Sch (ABAP) nach Klasse lokal Schroed (ABAP), ohne dabei eine Weiterleitung anzulegen)

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.