Как я могу вызвать конструктор класса из статического метода? - PullRequest
1 голос
/ 26 апреля 2019

В моем коде я хочу вызвать метод CLASS_CONSTRUCTOR из статического метода ADD_BOOK.

Однако я получаю эту синтаксическую ошибку:

Прямой вызов специального метода "CLASS_CONSTRUCTOR" не возможно.

Вот код:

CLASS lcl_books DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS class_constructor.
    CLASS-METHODS add_book.
    ...
ENDCLASS.

CLASS lcl_books IMPLEMENTATION.
  METHOD class_constructor.
    SELECT * FROM zgib_bmabuecher INTO TABLE gt_return.
  ENDMETHOD.

  METHOD add_book.
    DATA lf_check TYPE n VALUE 0.
    LOOP AT gt_return INTO mf_books.
      IF if_book-isbn = mf_books-isbn.
        lf_check = 1.
      ENDIF.
    ENDLOOP.
    IF lf_check = 0.
      INSERT zgib_bmabuecher FROM if_book.
    ENDIF.
    lcl_books=>class_constructor( ).
  ENDMETHOD.

ENDCLASS.

1 Ответ

8 голосов
/ 26 апреля 2019

У вас есть вся информация в сообщении об ошибке. Вы не можете (немецкий: darfst nicht) явно вызывать конструктор класса. Он всегда вызывается автоматически и только один раз, когда класс используется впервые.

Если вы хотите повторно использовать код конструктора класса, поместите его в другой метод класса, например, так:

CLASS lcl_books DEFINITION.
  "...
  PRIVATE SECTION.
    CLASS-METHODS:
      select_books.
  "...
ENDCLASS.

CLASS lcl_books IMPLEMENTATION.
  METHOD class_constructor.
    select_books( ).
  ENDMETHOD.

  METHOD select_books.
    SELECT * FROM zgib_bmabuecher INTO TABLE gt_return.
  ENDMETHOD.

Затем измените ваш add_book метод на

METHOD add_book.
    DATA lf_check TYPE n VALUE 0.
    LOOP AT gt_return INTO mf_books.
      IF if_book-isbn = mf_books-isbn.
        lf_check = 1.
      ENDIF.
    ENDLOOP.
    IF lf_check = 0.
      INSERT zgib_bmabuecher FROM if_book.
    ENDIF.
    select_books( ).
  ENDMETHOD.

ENDCLASS.
...