Время чтения ~3 мин.

Guten Tag друзья!

Сегодня я хочу рассказать вам забавный трюк, о котором недавно узнал.

INITIALIZATION

Для того, чтобы повествование было целостным, начну с небольшого отступления.

В abap есть два вида классов:

  • локальные
  • глобальные

Отличаются они только областью видимости.

Локальный класс виден только в пределах того контекста в котором он описан. Это может быть, например, отчет, группа функций или глобальный класс.

Глобальный класс виден во всей системе.

START-OF-SELECTION

Так уж случилось, что в одной из разработок мне понадобилось создавать объекты локальных классов внутри метода глобального класса.

Здесь у вас может возникнуть резонный вопрос: зачем же так делать? Очевидно же, что есть какие-то проблемы с архитектурой приложения и нужно решать их, а не выдумывать тут!

Что ж, это тема для отдельной дискуссии, поэтому предлагаю пока не заострять на этом внимание и рассмотреть вопрос из сабжа на предмет того, возможно ли это в принципе.

Итак, предположим у нас есть локальный класс lcl_local, описанный в отчете (Report) zhr_test. Понятное дело, что область видимости класса lcl_local ограничивается отчетом zhr_test.

Так же, у нас есть глобальный класс zcl_global с методом, допустим, run( ).

Задача состоит в том, чтобы создать объект класса lcl_local внутри метода глобального класса zcl_global?

Другими словами, как сделать так, чтобы локальный класс стал виден глобально?

END-OF-SELECTION

Ответ на этот вопрос прост.

Для того, чтобы создать объект локального класса внутри глобального необходимо чтобы его имя выглядело так:

\PROGRAM={PROGRAM_NAME}\CLASS={LOCAL_CLASS_NAME}

Проверяем.

Подозреваю, что \PROGRAM={PROGRAM_NAME} в имени класса может меняться на \CLASS={GLOBAL_CLASS_NAME}, если локальный класс объявлен в глобальном. Но я не проверял.


Будет ли вам эта информация полезна для применения? Сомневаюсь.

Но знание того, что в принципе технически это возможно, думаю, не помешает.

Напоминаю, что следить за выходом новых постов можно здесь.

На сегодня все, пока!

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.