Время чтения ~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}, если локальный класс объявлен в глобальном. Но я не проверял.
Будет ли вам эта информация полезна для применения? Сомневаюсь.
Но знание того, что в принципе технически это возможно, думаю, не помешает.
Напоминаю, что следить за выходом новых постов можно здесь.
На сегодня все, пока!