Übung Schrödinger: 10 Interfaces (ABAP)

Listing der Übungsaufgaben zum Thema Interfaces aus Kapitel 10 des Buchs "Schrödinger programmiert ABAP".

REPORT zsch_matt_searchit.

INTERFACE lif_search.
  METHODS get_it
    IMPORTING
      id_thing TYPE string
    EXPORTING
      et_things TYPE stringtab.
  DATA gd_things_count TYPE i.
ENDINTERFACE.

CLASS lcl_katze DEFINITION.
  PUBLIC SECTION.
    INTERFACES lif_search.
    METHODS get_it.
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.

CLASS lcl_katze IMPLEMENTATION.
  METHOD lif_search~get_it.
    DATA: ld_thing LIKE LINE OF et_things.

    CONCATENATE 'Du suchst ' id_thing
      INTO ld_thing SEPARATED BY space.

    APPEND 'Ich bin es, die Katze' TO et_things.
    APPEND ld_thing TO et_things.
    APPEND 'Ich bringe dir eine Maus' TO et_things.
  ENDMETHOD.

  METHOD get_it.
    " Die Methode get_it kann in der Klassenimplementierung mit
    " gleichem Namen, wie die Methode des Interfaces vorhanden sein.
    " Im vorliegenden Fall ist die Methodenimplementierung jedoch
    " nicht notwendig.
  ENDMETHOD.
ENDCLASS.

CLASS lcl_hund DEFINITION.
  PUBLIC SECTION.
    INTERFACES lif_search.
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.

CLASS lcl_hund IMPLEMENTATION.
  METHOD lif_search~get_it.
    DATA: ld_thing LIKE LINE OF et_things.

    CONCATENATE 'Du suchst ' id_thing
      INTO ld_thing SEPARATED BY space.

    APPEND 'Ich bin es, der Hund' TO et_things.
    APPEND ld_thing TO et_things.
    APPEND 'Ich bringe dir einen Knochen' TO et_things.
  ENDMETHOD.
ENDCLASS.

DATA: gr_schroedingers_katze TYPE REF TO lcl_katze, "Objektreferenz
      gr_schroedingers_hund TYPE REF TO lcl_hund, "Objektreferenz
      gr_search TYPE REF TO lif_search, "Interface-Referenz
      gt_things TYPE stringtab,
      gs_things LIKE LINE OF gt_things.

START-OF-SELECTION.
  CREATE OBJECT: gr_schroedingers_katze,
                 gr_schroedingers_hund.

  " Der statische Typ der gr_search-Referenz ist das Interface
  " Der dynamische Typ der gr_search-Referenz ist der Typ,
  " der der Interface-Referenz zugewiesen wurde.

  " Im Grunde ist eine Interface-Referenz wie eine
  " Objektreferenz mit einem Filter, da nur die
  " Methoden ansprechbar sind, die im Interface definiert wurden.

  " Up-Cast - Spricht mit der Katze
  " Durch das Interface
  gr_search = gr_schroedingers_katze.
  gr_search->get_it(
    EXPORTING
      id_thing  = 'Stock'
    IMPORTING
      et_things = gt_things ).

  " Up-Cast - Spricht mit dem Hund
  gr_search = gr_schroedingers_hund.
  gr_search->get_it(
    EXPORTING
      id_thing  = 'Stock'
    IMPORTING
      et_things = gt_things ).

  LOOP AT gt_things INTO gs_things.
    WRITE: / gs_things.
  ENDLOOP.