*================================ Casting ======================================*
CLASS lc_super DEFINITION.
PUBLIC SECTION.
METHODS : addition IMPORTING f1 TYPE i
f2 TYPE i
EXPORTING f3 TYPE i.
METHODS : subtract CHANGING f3 TYPE i.
METHODS : divide CHANGING f3 TYPE i.
ENDCLASS.
CLASS lc_super IMPLEMENTATION.
METHOD addition.
f3 = f1 + f2.
ENDMETHOD.
METHOD subtract.
f3 = f3 - 1.
ENDMETHOD.
METHOD divide.
f3 = f3 / 2.
ENDMETHOD.
ENDCLASS.
CLASS lc_sub_1 DEFINITION INHERITING FROM lc_super.
PUBLIC SECTION.
METHODS : addition REDEFINITION.
METHODS : multiple CHANGING f3 TYPE i.
ENDCLASS.
CLASS lc_sub_1 IMPLEMENTATION.
METHOD addition.
f3 = f1 + f2 + 10.
ENDMETHOD.
METHOD multiple.
f3 = f3 * 16.
ENDMETHOD.
ENDCLASS.
PARAMETERS : p_var1 TYPE i,
p_var2 TYPE i,
p_var3 TYPE i,
p_var4 TYPE i,
p_var5 TYPE i,
p_var6 TYPE i.
START-OF-SELECTION.
DATA : lcl_ref TYPE REF TO lc_super,
lcl_sub TYPE REF TO lc_sub_1.
CREATE OBJECT lcl_sub.
lcl_ref = lcl_sub.
CALL METHOD lcl_ref->addition
EXPORTING
f1 = p_var1
f2 = p_var2
IMPORTING
f3 = p_var3.
WRITE : / 'Addition :', p_var3.
CALL METHOD lcl_ref->subtract
CHANGING
f3 = p_var3.
WRITE : / 'Subtraction :', p_var3.
CALL METHOD lcl_ref->('MULTIPLE')
CHANGING
f3 = p_var3.
WRITE : / 'Mulitplication :', p_var3.
CALL METHOD lcl_ref->divide
CHANGING
f3 = p_var3.
DATA : lcl_temp TYPE REF TO lc_sub_1.
CLEAR : lcl_ref, lcl_sub.
CREATE OBJECT lcl_temp.
lcl_ref = lcl_temp.
DATA : lo_cast_error TYPE REF TO cx_sy_move_cast_error..
TRY.
lcl_sub ?= lcl_ref.
CATCH cx_sy_move_cast_error INTO lo_cast_error.
WRITE: / 'Widening cast failed 2'.
ENDTRY.
IF lcl_sub IS NOT INITIAL.
CALL METHOD lcl_sub->addition
EXPORTING
f1 = p_var4
f2 = p_var5
IMPORTING
f3 = p_var6.
WRITE: / p_var6.
CALL METHOD lcl_sub->subtract
CHANGING
f3 = p_var6.
WRITE: / p_var6.
CALL METHOD lcl_sub->multiple
CHANGING
f3 = p_var6.
WRITE: / p_var6.
CALL METHOD lcl_sub->divide
CHANGING
f3 = p_var6.
WRITE : p_var6.
ENDIF.
END-OF-SELECTION.
*================================ Casting ======================================*
CLASS lc_super DEFINITION.
PUBLIC SECTION.
METHODS : addition IMPORTING f1 TYPE i
f2 TYPE i
EXPORTING f3 TYPE i.
METHODS : subtract CHANGING f3 TYPE i.
METHODS : divide CHANGING f3 TYPE i.
ENDCLASS.
CLASS lc_super IMPLEMENTATION.
METHOD addition.
f3 = f1 + f2.
ENDMETHOD.
METHOD subtract.
f3 = f3 - 1.
ENDMETHOD.
METHOD divide.
f3 = f3 / 2.
ENDMETHOD.
ENDCLASS.
CLASS lc_sub_1 DEFINITION INHERITING FROM lc_super.
PUBLIC SECTION.
METHODS : addition REDEFINITION.
METHODS : multiple CHANGING f3 TYPE i.
ENDCLASS.
CLASS lc_sub_1 IMPLEMENTATION.
METHOD addition.
f3 = f1 + f2 + 10.
ENDMETHOD.
METHOD multiple.
f3 = f3 * 16.
ENDMETHOD.
ENDCLASS.
PARAMETERS : p_var1 TYPE i,
p_var2 TYPE i,
p_var3 TYPE i,
p_var4 TYPE i,
p_var5 TYPE i,
p_var6 TYPE i.
START-OF-SELECTION.
DATA : lcl_ref TYPE REF TO lc_super,
lcl_sub TYPE REF TO lc_sub_1.
CREATE OBJECT lcl_sub.
lcl_ref = lcl_sub.
CALL METHOD lcl_ref->addition
EXPORTING
f1 = p_var1
f2 = p_var2
IMPORTING
f3 = p_var3.
WRITE : / 'Addition :', p_var3.
CALL METHOD lcl_ref->subtract
CHANGING
f3 = p_var3.
WRITE : / 'Subtraction :', p_var3.
CALL METHOD lcl_ref->('MULTIPLE')
CHANGING
f3 = p_var3.
WRITE : / 'Mulitplication :', p_var3.
CALL METHOD lcl_ref->divide
CHANGING
f3 = p_var3.
DATA : lcl_temp TYPE REF TO lc_sub_1.
CLEAR : lcl_ref, lcl_sub.
CREATE OBJECT lcl_temp.
lcl_ref = lcl_temp.
DATA : lo_cast_error TYPE REF TO cx_sy_move_cast_error..
TRY.
lcl_sub ?= lcl_ref.
CATCH cx_sy_move_cast_error INTO lo_cast_error.
WRITE: / 'Widening cast failed 2'.
ENDTRY.
IF lcl_sub IS NOT INITIAL.
CALL METHOD lcl_sub->addition
EXPORTING
f1 = p_var4
f2 = p_var5
IMPORTING
f3 = p_var6.
WRITE: / p_var6.
CALL METHOD lcl_sub->subtract
CHANGING
f3 = p_var6.
WRITE: / p_var6.
CALL METHOD lcl_sub->multiple
CHANGING
f3 = p_var6.
WRITE: / p_var6.
CALL METHOD lcl_sub->divide
CHANGING
f3 = p_var6.
WRITE : p_var6.
ENDIF.
END-OF-SELECTION.
*================================ Casting ======================================*