Thursday, 18 December 2014

Widening and Narrowing casting

*================================ 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_reflcl_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 ======================================*