Можно ли реализовать идею ниже? Идея состоит в том, что он работает почти так же, как ОТКЛОНЯТЬ из оператора ПОЛУЧАТЬ, но внутри парадигмы объектно-ориентированного программирования.
start-of-selection
lv_max_lines = class1->get_max_lines( ).
do lv_max_lines.
class2->method1( class1->get_line_by_index( sy-index ) ).
enddo.
class 2 implementation.
method method1.
method2( is_line ).
endmethod.
method method2.
method3( is_line ).
endmethod.
method method3.
if ls_line <> what_I_need.
class1->reject( ). "or
class1->reject( is_line ).
"go back straight to start of selection and execute next iteration,
"ignoring the rest of method3 and metho2 and method1 from class2.
endif.
"more process
endmethod.
endclass.
Конечно, это можно сделать с несколькими условиями в методах класса 2 и операторах return
, но идея состоит в том, чтобы смоделировать отклонение, которое не требует каких-либо модификаций класса 2, вся работа будет оставлена для обработки классу 1.
Одна из идей, которые у меня были, заключалась в том, чтобы удалить текущую строку из таблицы class1, к которой осуществляется доступ, это не сработает должным образом, на самом деле я не уверен, как это сработает.
Я думаю, что это невозможно достичь, но я хотел бы попробовать, несмотря ни на что.
Да, возможно через исключения на основе классов, наследуемый от класса CX_NO_CHECK
.
" inherit cx_no_check to let the exception bubble upwards
" without having to redeclare it
class bad_input definition inheriting from cx_no_check.
endclass.
start-of-selection
lv_max_lines = class1->get_max_lines( ).
do lv_max_lines times.
try.
class2->method1( class1->get_line_by_index( sy-index ) ).
catch bad_input.
" do nothing, just continue with the next line
endtry.
enddo.
class class2 definition.
public section.
methods method1 importing is_line type whatever.
private section.
methods method2 importing is_line type whatever.
methods method3
importing
is_line type whatever.
endclass.
class class2 implementation.
method method1.
method2( is_line ).
endmethod.
method method2.
method3( is_line ).
endmethod.
method method3.
if ls_line <> what_I_need.
raise exception new bad_input( ).
endif.
"more process
endmethod.
endclass.
Я отредактировал пост: нельзя вводить класс CX_NO_CHECK за словом RAISING.
А, спасибо - конечно. Вот что происходит, когда вы блокируете код, а не компилируете его...
В OO "отклонение" (своего рода прыжок) можно смоделировать с помощью исключения на основе классов.