*&---------------------------------------------------------------------*
*& Report ZSCH_08_C_MACHINE
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zsch_08_c_machine.
******************************************************
*Definitionsteil des Wasserbehlters
CLASS lcl_wasserbehaelter DEFINITION.
* Hier kommen die Definitionen rein
* ffentlicher Bereich
  PUBLIC SECTION.
* Wasserstand holen
    METHODS  get_wasserstand
      RETURNING VALUE(rd_wasserstand) TYPE i.
* Wasserstand setzen
    METHODS set_wasserstand
      IMPORTING
        id_wasserstand TYPE i.

* Wasserhrte Grenze in dH
    CONSTANTS: gc_wasser_haerte_grenze TYPE f VALUE '14.0'.
*Wasserhrte prfen
    METHODS check_wasser_haerte.

*Geschtzter Bereich
  PROTECTED SECTION.

*Privater Bereich
  PRIVATE SECTION.

*Wasserstand
    DATA: gd_wasserstand TYPE i.
*Wasserhrte
    DATA: gd_wasser_haerte TYPE f.
ENDCLASS.

*Implementationsteil des Wasserbehlters
CLASS lcl_wasserbehaelter IMPLEMENTATION.
* Hier kommen die Implementierungen rein
*Wasserbehlter
  METHOD get_wasserstand.
*Wasserstand zurckliefern
    rd_wasserstand = gd_wasserstand.
  ENDMETHOD.
* Wasserstand setzen
  METHOD set_wasserstand.
    gd_wasserstand = id_wasserstand.
  ENDMETHOD.
* Wasserhrte prfen
  METHOD check_wasser_haerte.
    IF me->gd_wasser_haerte > gc_wasser_haerte_grenze.
      MESSAGE 'AU, das tut weh!' TYPE 'I'.
    ENDIF.
  ENDMETHOD.
ENDCLASS.

TYPE-POOLS: abap.
CLASS lcl_kaffeevollautomat DEFINITION.
* Hier kommen die Definitionen rein
* ffentlicher Bereich
  PUBLIC SECTION.
* Anzahl der Objekte
    CLASS-DATA: anz_kva TYPE i.
*    Constructor deklarieren
    METHODS constructor.
* Kaffee bitte
    METHODS ein_kaffe_sil_vous_plait
      IMPORTING
        VALUE(id_espresso)      TYPE abap_bool OPTIONAL
        VALUE(id_verlaengerter) TYPE abap_bool OPTIONAL.
* Add
*    CLASS-METHODS add_1_to_anz_kva .
    METHODS:
* Bohne ergnzen
      bohne_nachfuellen
        IMPORTING
          ir_bohne TYPE REF TO zcl_sch_08_cbean.
*Geschtzter Bereich
  PROTECTED SECTION.

*Privater Bereich
  PRIVATE SECTION.
* Wasserstand
    DATA gd_wasserstand TYPE i.
* Die Assoziation zum Wasserbehlter
    DATA: gr_wasserbehaelter
            TYPE REF TO lcl_wasserbehaelter.
    DATA: gr_bohnenbehaelter
            TYPE REF TO zcl_sch_08_cbean_box.
ENDCLASS.
CLASS lcl_kaffeevollautomat IMPLEMENTATION.
* Hier kommen die Implementierungen rein

  METHOD constructor.
* Initialisierung fr das Objekt
* eine Variante: anz_kva ? anz:_kva + 1. oder
    ADD 1 TO lcl_kaffeevollautomat=>anz_kva.
*    CALL METHOD add_1_to_anz_kva.
*  Wasserbehter erzeugen
    CREATE OBJECT me->gr_wasserbehaelter.
* Wasserstand setzen
    me->gr_wasserbehaelter->set_wasserstand(
      id_wasserstand = 1000 ).
* Bohnenbehlter erzeugen
    CREATE OBJECT me->gr_bohnenbehaelter.
  ENDMETHOD.
*Bohne nachfllen
  METHOD bohne_nachfuellen.
* Bohne bergeben
    me->gr_bohnenbehaelter->add_bean_to_box(ir_cbean = ir_bohne ).
  ENDMETHOD.
ENDCLASS.
* Kaffeezubereitungsart
DATA gd_zubereitungsart TYPE char40 VALUE 'ESPRESSO'.
*Ref auf KVA
DATA gr_roland_kva TYPE REF TO lcl_kaffeevollautomat.
DATA gr_mein_kva TYPE REF TO lcl_kaffeevollautomat.
DATA gr_golden_bean TYPE REF TO zcl_sch_08_cbean.

******************************************************
START-OF-SELECTION.
*Mein & Rolands KVA
  CREATE OBJECT gr_roland_kva.
  CREATE OBJECT gr_mein_kva.
*Bohnenschleife
  DO 7000 TIMES.
*Bohne anlegen
    CREATE OBJECT gr_golden_bean.
*Bohne bergeben
    gr_mein_kva->bohne_nachfuellen(
      ir_bohne = gr_golden_bean ).
  ENDDO.