2012-03-13 67 views
4

我充满了对我要创造,像这样(第一行是内表ITAB的报头)的对象类型引用内部表:如何动态地创建基于ABAP内部表的对象?

+==========+===============+ 
| 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行?

+0

问候,你想与这些对象做什么?他们有共同的方法或属性,你想使用? – tomdemuyt 2012-03-13 16:40:13

+0

@tomdemuyt现在,他们没有共同的方法或属性。我有点试图创建一个类似的功能SCII,其中你创建一个新的类使用模板CL_CI_CATEGORY和CL_CI_SCAN当你想添加额外的检查到SCI。我认为做的是创建一个自定义的z表来保存所有值可选测试用户可能想要做的。因此在运行时动态地创建对象,因为直到那时程序才知道检查用户希望执行什么。我不知道我的设计是否好,所以请告知。 – Eric 2012-03-13 23:59:25

回答

7

首先,这是一个好主意,提供一个接口或抽象超类,并有各个类实现该接口或子类化抽象类 - 这会为你节省很多不必要的铸件。假设您的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). 

如果你想使用本地类,你可以做同样的 - 只使用一个较长的类型名称(SEOCLASS与它的30个字符是不够的),并作为RTTI的在线文档中描述的指定类型名称:

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