мои 5 копеек
про вызов protected метода вроде все просто
создавать callback-и или реализовывать интерфейс в ABAP не очень удобно (создавать DEFINITION и IMPLEMENTATION в локальных классах долго)
лямбда выражений тоже нет
передачу параметров в методы
можно реализовать след-м способомв 7.5 выглядит компактно
Code:
REPORT zzz1.
INTERFACE lif_common.
METHODS command IMPORTING method TYPE csequence
params TYPE abap_parmbind_tab OPTIONAL.
ENDINTERFACE.
CLASS lcl_common DEFINITION ABSTRACT.
PUBLIC SECTION.
INTERFACES lif_common.
ENDCLASS.
CLASS lcl_common IMPLEMENTATION.
METHOD lif_common~command.
TRY .
CALL METHOD me->(method)
PARAMETER-TABLE params.
CATCH cx_sy_dyn_call_illegal_method INTO DATA(oref).
WRITE:/ oref->get_text( ).
ENDTRY.
ENDMETHOD.
ENDCLASS.
CLASS lcl_t1 DEFINITION INHERITING FROM lcl_common.
PUBLIC SECTION.
METHODS print_name
IMPORTING
iv_name TYPE csequence.
METHODS power_2
IMPORTING
iv_number TYPE numeric
RETURNING VALUE(rv_result) TYPE i.
ENDCLASS.
CLASS lcl_t1 IMPLEMENTATION.
METHOD print_name.
WRITE:/ iv_name COLOR 1.
ENDMETHOD.
METHOD power_2.
rv_result = iv_number ** 2.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA obj TYPE REF TO lif_common.
obj = NEW lcl_t1( ).
" Передача имени
obj->command( method = 'PRINT_NAME' params = VALUE #(
( name = 'IV_NAME'
kind = cl_abap_objectdescr=>exporting
value = REF #( 'John Doe' ) )
) ).
" Квадрат значения
DATA: lv_result TYPE i.
obj->command( method = 'POWER_2' params = VALUE #(
( name = 'IV_NUMBER'
kind = cl_abap_objectdescr=>exporting
value = REF #( 5 ) )
( name = 'RV_RESULT'
kind = cl_abap_objectdescr=>receiving
value = REF #( lv_result ) )
) ).
WRITE / lv_result COLOR 2.