[ABAP] OO: Vererbung, Polymorphie, Aggregation, CAST

* Einfache Klasse für Demo von Vererbung, Polymorphie und Casting (Up/Down) von Objektreferenzen

* Oberklasse
CLASS lcl_auto DEFINITION.
  PUBLIC SECTION.
    METHODS:
      constructor
        IMPORTING
          i_name TYPE string.

    METHODS:
      get_name
        RETURNING VALUE(rv_name) TYPE string.

  PRIVATE SECTION.
    DATA: gv_name TYPE string.
ENDCLASS.

CLASS lcl_auto IMPLEMENTATION.
  METHOD constructor.
    gv_name = i_name.
  ENDMETHOD.

  METHOD get_name.
    rv_name = gv_name.
  ENDMETHOD.
ENDCLASS.

* Unterklasse, erbt von lcl_auto
CLASS lcl_kombi DEFINITION INHERITING FROM lcl_auto.
  PUBLIC SECTION.
    METHODS:
* neue funktionale Methode
* gibt Stauraum des Kombis zurück
      get_space
        RETURNING VALUE(rv_room) TYPE i.
ENDCLASS.

CLASS lcl_kombi IMPLEMENTATION.
  METHOD get_space.
    rv_room = 3.
  ENDMETHOD.
ENDCLASS.

* Unterklasse, erbt von lcl_auto
CLASS lcl_limo DEFINITION INHERITING FROM lcl_auto.
  PUBLIC SECTION.
    METHODS:
* neue funktionale Methode
* gibt cw-Wert zurück
      get_cw
        RETURNING VALUE(rv_cw) TYPE f.
ENDCLASS.

CLASS lcl_limo IMPLEMENTATION.
  METHOD get_cw.
    rv_cw = '1.22'.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
* Aggregation: iTab mit Referenzen auf Autos
  DATA: it_cars TYPE STANDARD TABLE OF REF TO lcl_auto.

* verschiedene Autotypen erzeugen und in iTab ablegen
* impliziter Up-Cast (Widening-Cast) von lcl_kombi und lcl_limo -> lcl_auto
  APPEND NEW lcl_kombi( 'Audi A3' ) TO it_cars.
  APPEND NEW lcl_kombi( 'VW Passat' ) TO it_cars.
  APPEND NEW lcl_limo( 'Mercedes C' ) TO it_cars.
  APPEND NEW lcl_limo( 'Skoda Octavia' ) TO it_cars.

* Tabelle mit Autos durchgehen
  LOOP AT it_cars ASSIGNING FIELD-SYMBOL(<fs_car>).

* funktionale Methode von lcl_car aufrufen
    WRITE: / <fs_car>->get_name( ).

* spezielle Methoden der von lcl_auto abgeleiteten Unterklassen aufrufen
    TRY.
* probieren, ob sich das Auto zu einem Kombi casten lässt
* expliziter Down-Cast (Narrowing-Cast) von lcl_auto -> lcl_kombi
        DATA(o_kombi) = CAST lcl_kombi( <fs_car> ).
* Stauraum des Kombis ausgeben
        WRITE: / o_kombi->get_space( ), 'm³'.
      CATCH cx_sy_move_cast_error.
        WRITE: / 'Kein Kombi'.
    ENDTRY.

    TRY.
* probieren, ob sich das Auto zu einer Limo casten lässt
* expliziter Down-Cast (Narrowing-Cast) von lcl_auto -> lcl_limo
        DATA(o_limo) = CAST lcl_limo( <fs_car> ).
* cw-Wert der Limo ausgeben
        WRITE: / 'cw = ', o_limo->get_cw( ).
      CATCH cx_sy_move_cast_error.
        WRITE: / 'Keine Limo'.
    ENDTRY.

    ULINE.

  ENDLOOP.