Возможно ли реализовать REJECT в abap OO? - PullRequest
0 голосов
/ 21 мая 2019

Возможно ли реализовать идею ниже?Идея состоит в том, что он работает почти как REJECT из оператора GET , но внутри парадигмы OO.

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.

Конечно, это можно сделать с несколькимиусловия в методах class2 и return операторах, но идея состояла бы в том, чтобы смоделировать отклонение, которое не требует, чтобы class2 имел какие-либо модификации, вся работа была бы оставлена ​​для обработки class1.

Одна идеяЯ должен был удалить текущую строку из таблицы class1, к которой осуществляется доступ, которая не будет работать должным образом, на самом деле, я не уверен, как это будет работать.

Я думаю, что это невозможно, но я бы хотел попробовать, независимо от того.

1 Ответ

4 голосов
/ 21 мая 2019

Да, это возможно посредством исключений на основе классов наследования от класса 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.
...