我有一个内部表填充了我想要创建的对象的类型引用,如下所示(第一行是内部表ITAB的标题):
+==========+===============+
| OBJ_TYPE | OBJ_CLASS_REF |
+==========+===============+
| TYPE1 | ZCL_CLASS1 |
|----------|---------------|
| TYPE2 | ZCL_CLASS2 |
+----------+---------------+
Run Code Online (Sandbox Code Playgroud)
我想在我的程序中做的是这个(我把行号):
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
Run Code Online (Sandbox Code Playgroud)
我如何成功完成第5和第6行?
首先,提供一个接口或一个抽象超类并让你的各种类实现该抽象类的接口或子类是一个好主意 - 这将为你节省大量不必要的转换.所以假设你有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.
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样填写表格:
ls_instance-type_name = 'ZCL_BAR'. " or wherever you get this value from
CREATE OBJECT ls_instance-instance TYPE (ls_instance-type_name).
Run Code Online (Sandbox Code Playgroud)
如果要使用本地类,可以执行相同的操作 - 只使用较长的类型名称(SEOCLASS及其30个字符是不够的)并指定类型名称,如RTTI在线文档中所述:
ls_instance-typename = '\PROGRAM=ZMYREPORT\CLASS=LCL_MYCLASS'.
Run Code Online (Sandbox Code Playgroud)