* 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.