Как мне динамически создавать объекты на основе внутренней таблицы в ABAP? - PullRequest
4 голосов
/ 13 марта 2012

У меня есть внутренняя таблица, заполненная ссылкой на тип для объектов, которые я хочу создать, например, так (первая строка - заголовок внутренней таблицы ITAB):

+==========+===============+
| OBJ_TYPE | OBJ_CLASS_REF |
+==========+===============+
| TYPE1    | ZCL_CLASS1    |
|----------|---------------|
| TYPE2    | ZCL_CLASS2    |
+----------+---------------+

Что я хотел бы сделатьв моей программе это (я поставил номера строк):

1   LOOP AT itab
2    "Concatenate LO_ and the value of ITAB-OBJ_TYPE
3     CONCATENATE 'LO_' itab-obj_type INTO v_obj_name.
4    "Create a reference object
5     CREATE DATA (v_obj_name) TYPE REF TO itab-obj_type.
6     CREATE OBJECT (v_obj_name).
7   ENDLOOP

Как мне успешно сделать строки 5 и 6?

1 Ответ

7 голосов
/ 13 марта 2012

Прежде всего, это хорошая идея - предоставить интерфейс или абстрактный суперкласс, и пусть ваши различные классы реализуют этот интерфейс или подкласс этого абстрактного класса - это избавит вас от ненужного приведения типов.Допустим, у вас есть ZIF_FOO с классами ZCL_BAR и ZCL_BAZ, реализующими его.Таблица может быть

TYPES: BEGIN OF t_line
         type_name TYPE seoclass,
         instance  TYPE REF TO zif_foo,
       END OF t_line.
DATA: lt_instances TYPE STANDARD TABLE OF t_line,
      ls_instance  TYPE t_line.

Тогда вы можете заполнить таблицу следующим образом:

ls_instance-type_name = 'ZCL_BAR'. " or wherever you get this value from
CREATE OBJECT ls_instance-instance TYPE (ls_instance-type_name).

Если вы хотите использовать локальные классы, вы можете сделать то же самое - просто используйте более длинный типname (SEOCLASS с его 30 символами будет недостаточно) и укажите имя типа, как описано в онлайн-документации RTTI:

ls_instance-typename = '\PROGRAM=ZMYREPORT\CLASS=LCL_MYCLASS'.
...