Есть несколько классов реализующих одинаковый интерфейс. Как определить принадлежность к тому или иному классу? Рассмотрим на примере.
Интерфейс lif_professional содержит переменную mv_expirience, содержащую показатель опыта и метод do_work. Два класса lcl_abaper и lcl_consultant реализуют данный интерфейс.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
INTERFACE lif_professional. DATA: mv_expirience TYPE char128. METHODS do_work. ENDINTERFACE. CLASS lcl_abaper DEFINITION. PUBLIC SECTION. INTERFACES lif_professional. METHODS pass_exam. PROTECTED SECTION. DATA: mv_sertificate TYPE char128. ALIASES: mv_expirience FOR lif_professional~mv_expirience. ENDCLASS. CLASS lcl_consultant DEFINITION. PUBLIC SECTION. INTERFACES lif_professional. PROTECTED SECTION. ALIASES: mv_expirience FOR lif_professional~mv_expirience. METHODS get_cources. ENDCLASS. |
Создадим класс lcl_test со статическим методом test, который получает на вход объект типа ссылка на интерфейс lif_professional. Определим класс объекта.
Определение класса lcl_test:
1 2 3 4 5 6 |
*-----MAIN LOGIC---* CLASS lcl_test DEFINITION. PUBLIC SECTION. CLASS-METHODS: test IMPORTING io_prof TYPE REF TO lif_professional. ENDCLASS. |
В основном блоке программы объявляем переменную типа ссылка на интерфейс lif_professional и создаем ее как объект класса lcl_abaper.
1 2 3 4 5 6 7 8 |
*---EVENTS---* START-OF-SELECTION. DATA: go_person TYPE REF TO lif_professional. go_person = NEW lcl_abaper( ). * Проверим принадлежность объекта интерфейса к классу lcl_test=>test( go_person ). |
Способ 1. CASTING
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
METHOD test1. DATA: lo_cons TYPE REF TO lcl_consultant, lo_abap TYPE REF TO lcl_abaper. WRITE / '1. Testing operator ?='. TRY. lo_cons ?= io_prof. WRITE / 'Consultant'. CATCH cx_sy_move_cast_error. WRITE / 'Not consultant'. ENDTRY. TRY. lo_abap ?= io_prof. WRITE / 'Abaper'. CATCH cx_sy_move_cast_error. WRITE / 'Not abaper'. ENDTRY. ENDMETHOD. |
Результат выполнения:

Способ 2. С помощью класса cl_abap_classdescr.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
METHOD test. DATA: lo_descr TYPE REF TO cl_abap_classdescr. WRITE / '3. Testing with CL_ABAP_CLASSDESCR'. lo_descr ?= cl_abap_classdescr=>describe_by_object_ref( io_prof ). CASE lo_descr->get_relative_name( ). WHEN 'LCL_CONSULTANT'. WRITE / 'Consultant'. WHEN 'LCL_ABAPER'. WRITE / 'Abaper'. ENDCASE. ENDMETHOD. |
Результат выполнения

Способ 3. С помощью нового оператора IS INSTANCE OF
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
METHOD test. WRITE / '2. Testing operator IS INSTANCE OF'. "Оператор IS INSTANCE OF IF io_prof IS INSTANCE OF lcl_consultant. WRITE / 'Consultant'. ELSE. WRITE / 'Not consultant'. ENDIF. IF io_prof IS INSTANCE OF lcl_abaper. WRITE / 'Abaper'. ELSE. WRITE / 'Not abaper'. ENDIF. ENDMETHOD. |
Результат выполнения

Способ 4. С помощью нового оператора CASE TYPE OF & WHEN TYPE
1 2 3 4 5 6 7 8 9 10 11 12 |
METHOD test. DATA: lo_cons TYPE REF TO lcl_consultant, lo_abaper TYPE REF TO lcl_abaper. WRITE / '3. Testing operator CASE TYPE OF & WHEN TYPE'. CASE TYPE OF io_prof. WHEN TYPE lcl_consultant. WRITE / 'Consultant'. WHEN TYPE lcl_abaper INTO lo_abaper. WRITE / 'Abaper'. ENDCASE. ENDMETHOD. |
Результат выполнения
