Skip to content

Instantly share code, notes, and snippets.

@alezhu
Last active November 2, 2020 12:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alezhu/edc3918192fedf8196b0c28b3c84b4d0 to your computer and use it in GitHub Desktop.
Save alezhu/edc3918192fedf8196b0c28b3c84b4d0 to your computer and use it in GitHub Desktop.
Strange behaviour of class casting
REPORT ztest_class_ref_data.
CLASS lcl_abstract_data DEFINITION ABSTRACT.ENDCLASS.
CLASS lcl_abstract_processor DEFINITION ABSTRACT.
PUBLIC SECTION.
METHODS constructor IMPORTING io_data TYPE REF TO lcl_abstract_data.
PROTECTED SECTION.
DATA mo_data TYPE REF TO lcl_abstract_data.
ENDCLASS.
CLASS lcl_abstract_processor IMPLEMENTATION.
METHOD constructor.
mo_data = io_data.
ENDMETHOD.
ENDCLASS.
CLASS lcl_data DEFINITION INHERITING FROM lcl_abstract_data.
PUBLIC SECTION.
TYPES tt_data TYPE STANDARD TABLE OF i WITH EMPTY KEY.
DATA mt_data TYPE tt_data.
CLASS-METHODS cast
IMPORTING io_data TYPE REF TO lcl_abstract_data
RETURNING VALUE(ro_data) TYPE REF TO lcl_data.
METHODS print .
ENDCLASS.
CLASS lcl_data IMPLEMENTATION.
METHOD cast.
ro_data ?= io_data.
ENDMETHOD.
METHOD print.
LOOP AT mt_data INTO DATA(lv_value).
WRITE lv_value. NEW-LINE.
ENDLOOP.
ULINE.
ENDMETHOD.
ENDCLASS.
CLASS lcl_processor DEFINITION INHERITING FROM lcl_abstract_processor.
PUBLIC SECTION.
METHODS process .
METHODS process2.
METHODS process3.
ENDCLASS.
CLASS lcl_processor IMPLEMENTATION.
METHOD process.
DATA(lo_data) = lcl_data=>cast( mo_data ).
LOOP AT lo_data->mt_data ASSIGNING FIELD-SYMBOL(<v_value>).
ADD 1 TO <v_value>.
ENDLOOP.
ENDMETHOD.
METHOD process2.
LOOP AT CAST lcl_data( mo_data )->mt_data ASSIGNING FIELD-SYMBOL(<v_value>).
ADD 1 TO <v_value>.
ENDLOOP.
ENDMETHOD.
METHOD process3.
LOOP AT lcl_data=>cast( mo_data )->mt_data ASSIGNING FIELD-SYMBOL(<v_value>).
ADD 1 TO <v_value>.
ENDLOOP.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(lo_data) = NEW lcl_data( ).
lo_data->mt_data = VALUE #( ( 1 ) ( 2 ) ).
DATA(lo_processor) = NEW lcl_processor( lo_data ).
lo_data->print( ).
lo_processor->process( ).
lo_data->print( ).
lo_processor->process2( ).
lo_data->print( ).
lo_processor->process3( ).
lo_data->print( ).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment