ABAP New Features - OO programmi
2017-07-28 本文已影响0人
LiuliuZhang
Upcasting/ Downcasting with CAST
7.4前,通过cl_abap_typedescr取得structure的metadata,然后调用components方法取得结构中所有字段信息到内表中,7.4后,通过CAST将代码写到一行中,变得更加简单了。
*--------------------------------------------------------------------*
* Listing 2.76 Components of a Specific Dictionary Structure without CAST
*--------------------------------------------------------------------*
DATA structure_description TYPE REF TO cl_abap_structdescr.
structure_description ?= cl_abap_typedescr=>describe_by_name( 'ZSC_MONSTER_HEADER' ).
DATA structure_components TYPE abap_compdescr_tab.
structure_components = structure_description->components.
*--------------------------------------------------------------------*
* Listing 2.77 Components of a Specific Dictionary Structure with CAST
*--------------------------------------------------------------------*
DATA(structure_components2) = CAST cl_abap_structdescr(
cl_abap_typedescr=>describe_by_name( 'ZSC_MONSTER_HEADER' ) )->components.
Finding the Subclass of an Object Instance
如下代码,io_salv_adapter参数的类型为父类,实际传入的是它的子类,在方法中判断时,以前通过?=
类型转换是否成功。后来引入了IS INSTANCE OF
来判断,还可以用CASE语句来判断。
DATA: full_screen_adapter TYPE REF TO cl_salv_fullscreen_adapter,
container_adapter TYPE REF TO cl_salv_grid_adapter.
TRY.
full_screen_adapter ?= io_salv_adapter.
"Get the Grid
ro_alv_grid = full_screen_adapter->get_grid( ).
CATCH cx_sy_move_cast_error.
container_adapter ?= io_salv_adapter.
ro_alv_grid = container_adapter->get_grid( ).
ENDTRY.
*--------------------------------------------------------------------*
* Listing 2.79 : Trying to find the subclass in 7.50
*--------------------------------------------------------------------*
IF io_salv_adapter IS INSTANCE OF cl_salv_fullscreen_adapter.
full_screen_adapter ?= io_salv_adapter.
ro_alv_grid = full_screen_adapter->get_grid( ).
ELSEIF io_salv_adapter IS INSTANCE OF cl_salv_grid_adapter.
container_adapter ?= io_salv_adapter.
ro_alv_grid = container_adapter->get_grid( ).
ENDIF.
*--------------------------------------------------------------------*
* Listing 2.80 : Another way to find the subclass in 7.50
*--------------------------------------------------------------------*
CASE TYPE OF io_salv_adapter.
WHEN TYPE cl_salv_fullscreen_adapter INTO DATA(full_screen_adapter2).
ro_alv_grid = full_screen_adapter2->get_grid( ).
WHEN TYPE cl_salv_grid_adapter INTO DATA(container_adapter2).
ro_alv_grid = container_adapter2->get_grid( ).
WHEN OTHERS.
RETURN.
ENDCASE.