ABAP ООП Ч.4. Экземпляр и статические компоненты, События.

ABAP ООП

 Экземпляр и статические компоненты

Класс может содержать как экземплярные, так и статические компоненты. Атрибут экземпляра может иметь несколько экземпляров в программе, тогда как статический атрибут имеет только один экземпляр. Доступ к экземплярному компоненту осуществляется через ссылочный объект с помощью селектора компонентов объекта ->, тогда как доступ к статическому компоненту осуществляется с помощью селектора компонентов класса =>. Во время определения статическим компонентам предшествует ключевое слово CLASS.

В коде ниже показано определение как экземпляра, так и статического компонента. Для простоты в этом примере мы обращаемся к атрибутам класса напрямую, но в реальном коде всегда следует избегать прямого доступа к атрибутам, используя методы установки и получения.
CLASS lcl_person DEFINITION.
  PUBLIC SECTION.
    CLASS-DATA mv_height TYPE i."Статический атрибут
    DATA mv_weight TYPE i."Атрибут экземпляра
    METHODS get_bmi EXPORTING ev_bmi TYPE i."Метод экземпляра
    METHODS constructor"Конструктор экземпляра
      IMPORTING name TYPE char20.
    CLASS-METHODS set_height"Статический метод
      IMPORTING iv_height TYPE i.
    CLASS-METHODS class_constructor. "Статический конструктор
ENDCLASS.
CLASS lcl_person IMPLEMENTATION.
  METHOD class_constructor.
  ENDMETHOD.
  METHOD constructor.
  ENDMETHOD.
  METHOD get_bmi.
  ENDMETHOD.
  METHOD set_height.
  ENDMETHOD.
ENDCLASS.
DATA lo_oref TYPE REF TO lcl_person. "Определение ссылки на объекта
DATA lv_bmi TYPE i.

START-OF-SELECTION.
*Доступ к статическим атрибутам и методам с помощью селектора "=>"
* со ссылкой на класс
  lcl_person=>mv_height = 165.
  CALL METHOD lcl_person=>set_height
    EXPORTING
      iv_height = 165.
*Создание экземпляра объекта и доступ к атрибутам и методам экземпляра 
*с помощью селектора "->" со ссылкой на объект.
  CREATE OBJECT lo_oref
    EXPORTING
      name = 'JOHN'.
  lo_oref->mv_weight = 50.
  CALL METHOD lo_oref->get_bmi
    IMPORTING
      ev_bmi = lv_bmi.
Как показано, статические компоненты определяются предшествующим ключевым словом CLASS (например, CLASS-DATA, CLASS-METHODS) и доступны с помощью селектора => с прямой ссылкой на имя класса (например, class_name=>component). Статические методы чем-то похожи на функциональные модули тем, что в памяти программы существует только один экземпляр, и каждый последующий вызов метода указывает на один и тот же экземпляр, тогда как каждый ссылочный объект работает со своими собственными компонентами экземпляра.

Статический конструктор не может иметь никакого интерфейса параметров, тогда как конструктор экземпляра может иметь параметры импорта. Статический конструктор выполняется только один раз при первом доступе к любому из компонентов класса, включая создание экземпляра любого ссылочного объекта. Конструктор экземпляра выполняется каждый раз при создании экземпляра ссылочного объекта.

Instance Component VS Static Component
Компонент экземпляра Статический компонент
Доступ к компонентам экземпляра осуществляется через ссылочный объект с помощью селектора ->. Доступ к статическим компонентам можно получить непосредственно через ссылку на имя класса с помощью селектора => даже до того, как будет создан экземпляр ссылочного объекта. К ним также можно получить доступ с помощью ссылочного объекта.
Может существовать несколько экземпляров. Существует только один экземпляр.
В методе экземпляра можно получить доступ как к статическим атрибутам, так и к атрибутам экземпляра. В статическом методе можно получить доступ только к статическим атрибутам или статическим методам.
Чтобы получить доступ к компонентам экземпляра класса, в программе необходимо определить ссылочный объект и создать его экземпляр с помощью оператора CREATE OBJECT. Доступ к статическим компонентам можно получить непосредственно из программы с помощью ссылки на класс (аналогично прямому вызову функционального модуля) без необходимости в объекте ссылки.
Конструктор экземпляра может иметь только параметры импорта и выполняется каждый раз при создании экземпляра ссылочного объекта. Статический конструктор не может иметь никакого интерфейса параметров и выполняется только один раз за сеанс программы. Однако он выполняется перед конструктором экземпляра, если класс имеет как статический конструктор, так и конструктор экземпляра, а также при создании экземпляра первого ссылочного объекта, при условии, что он не был загружен ранее.

Events - События

События могут быть определены в классе, которые будут запускаться из метода (называемого триггерами), когда определенное событие происходит во время выполнения объекта; специальные методы (называемые обработчиками событий) реагируют на эти события.

Например, мы можем определить событие с именем double_click в классе, которое будет запускаться в одном из методов, когда пользователь дважды щелкает на отчет. Метод on_double_click можно определить как обработчик этого события, чтобы он выполнялся, когда событие double_click инициируется из метода триггера.

Чтобы инициировать событие, класс должен иметь события, определенные в части определения кода и запускаемые в одном из его методов. События экземпляра определяются с помощью ключевого слова EVENTS, а статические события определяются с помощью ключевого слова CLASS-EVENTS. Статическое событие может быть вызвано как статическими методами, так и методами экземпляра, тогда как событие экземпляра может быть вызвано только методом экземпляра.

События могут иметь параметры экспорта, которые передаются методу обработчика событий при запуске события. Для запуска события в одном из методов класса используется оператор RAISE EVENT имя_события. Дополнение EXPORTING используется с ключевым словом RAISE EVENT для передачи параметров события в метод обработчика событий.

Обработчики событий — это специальные методы, определенные для реагирования на событие. Методы обработчика событий определяются в части определения класса как методы для конкретных событий. Синтаксис для определения метода обработчика событий: METHODS method_name FOR EVENT event_name OF class_name, где method_name — это имя метода обработчика события, event_name — имя события, а class_name — имя класса, в котором определено событие. Если для события определены параметры экспорта, то обработчик события должен импортировать все необязательные параметры. Все события экземпляра имеют неявный параметр отправителя, который можно импортировать в обработчик событий. Параметр отправителя содержит ссылку на объект отправителя, в котором определено событие. Чтобы определить статический метод как обработчик событий, используйте ключевое слово CLASS-METHODS.

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

События экземпляра могут быть зарегистрированы для определенного экземпляра или для всех экземпляров, тогда как статические события регистрируются для всего класса.
*Синтаксис использования оператора SET HANDLER для событий экземпляра следующий:  
SET HANDLER event_handler_method FOR lo_oref.
*or:
SET HANDLER event_handler_method FOR ALL INSTANCES
*Синтаксис использования оператора SET HANDLER для статических событий следующий:
SET HANDLER event_handler_method.  
Здесь event_handler_method — это экземпляр или статический метод, определенный как обработчик события для события. Метод обработчика событий не будет запущен, если обработчик не зарегистрирован с помощью инструкции SET HANDLER.

Пример определения и регистрации событий в классе. В этом примере определяется класс lcl_events_demo с двумя событиями, double_click и right_click. Здесь double_click определяется как событие экземпляра, а right_click определяется как статическое событие. Для события double_click также определено несколько обязательных параметров экспорта (столбец и строка). Мы также определили метод trigger_event, который действует как метод триггера. Это определяется аналогично любому обычному методу. Методы on_double_click и on_right_click определены как методы обработчика событий для событий double_click и right_click соответственно.
CLASS lcl_events_demo DEFINITION.
  PUBLIC SECTION.
    EVENTS double_click
    EXPORTING
    VALUE(column) TYPE i
    VALUE(row) TYPE i.
    CLASS-EVENTS right_click.
    METHODS trigger_event.
    METHODS on_double_click FOR EVENT double_click OF lcl_events_demo
      IMPORTING
        column
        row
        sender.
    METHODS on_right_click FOR EVENT right_click OF lcl_events_demo.
ENDCLASS.
CLASS lcl_events_demo IMPLEMENTATION.
  METHOD trigger_event.
    RAISE EVENT double_click
    EXPORTING
    column = 4
    row = 5.
    RAISE EVENT right_click.
  ENDMETHOD.
  METHOD on_double_click.
    WRITE: /'Событие двойного щелчка, вызванное в столбце',column,
    'и строке',row.
  ENDMETHOD.
  METHOD on_right_click.
    WRITE: /'Инициировано событие правого клика'.
  ENDMETHOD.
ENDCLASS.
DATA lo_oref_ev TYPE REF TO lcl_events_demo.

START-OF-SELECTION.
  CREATE OBJECT lo_oref_ev.
  SET HANDLER lo_oref_ev->on_double_click FOR lo_oref_ev."событие экземпляра
  SET HANDLER lo_oref_ev->on_right_click. "обработчик статического события
  CALL METHOD lo_oref_ev->trigger_event( ).   
В части реализации класса метод trigger_event использует оператор RAISE EVENT для запуска событий double_click и right_click. Поскольку событие double_click содержит определенные параметры экспорта, этот метод экспортирует определенные значения в метод обработчика событий. Метод on_double_click импортирует значения, которые были экспортированы методом триггера. В программном коде события регистрируются с помощью оператора SET HANDLER, а код в методах обработчиков событий выполняется при вызове метода trigger_event.

Перевод книги #Complete ABAP / Kiran Bandari

Комментарии