Можно ли реализовать REJECT в abap 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.

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

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

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

В OO "отклонение" (своего рода прыжок) можно смоделировать с помощью исключения на основе классов.

Sandra Rossi 21.05.2019 07:21
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Принцип подстановки Лискова
Принцип подстановки Лискова
Принцип подстановки Лискова (LSP) - это принцип объектно-ориентированного программирования, который гласит, что объекты суперкласса должны иметь...
0
1
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Sandra Rossi 21.05.2019 16:47

А, спасибо - конечно. Вот что происходит, когда вы блокируете код, а не компилируете его...

Florian 22.05.2019 18:51

Другие вопросы по теме