动态创建子类的对象

2020-09-15 19:20发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好

我是Abap的新手,我想创建一个像控制器这样的父类,以及两个像模型一样的子类。

当我尝试创建动态类的对象来调用该方法时,我找不到解决方法。

这是我的代码示例,我知道我错过了一些事情。

*方法set_all_data。

DATA(方法名称)= | SET_ {组件->名称} |。

调用方法me->(方法名称)//
PARAMETER-TABLE参数。

*

当我通过名称class时,我想用me->代替该类的动态对象。

我希望任何人都能帮助我。

最佳

 CLASS lcl_controller定义
 *    上市
     创建公共。
   公共部分。

     方法构造函数
       导入model_name TYPE seoclsname。

     方法set_all_data
              导入model_name TYPE seoclsname可选
                        it_table TYPE数据可选。

     方法get_all_data。


   受保护的部分。
   专用部分。
     CLASS-DATA:lo_model类型REF TO对象,
                 lv_model TYPE seoclsname,
                 lt_table TYPE REF TO数据。

 ENDCLASS。



 类别lcl_controller的实现。

   METHOD构造函数。

     me-> lv_model = model_name。

 终结法。

   方法set_all_data。

     数据:struct_descr类型参考cl_abap_structdescr,
           参数TYPE abap_parmbind,
           参数TYPE abap_parmbind_tab。



     struct_descr = CAST cl_abap_structdescr(cl_abap_datadescr => describe_by_data(it_table))。



     环回struct_descr-> components引用到DATA(component)。

       清除参数。

       尝试。



           将ASSIGN COMPONENT组件->结构名称it_table转换为FIELD-SYMBOL()。

           如果sy-subrc = 0。

             参数名称=组件->名称。

             parameter-kind = cl_abap_objectdescr =>返回。

             将的引用获取到参数值中。



             INSERT参数INTO TABLE参数。

             DATA(方法名称)= | SET_ {组件->名称} |。



             呼叫方法me->(method_name)

               PARAMETER-TABLE参数。

           万一。



         捕获cx_sy_dyn_call_error INTO DATA(exc_ref)。

           DATA(exc_text)= exc_ref-> get_text()。

           消息exc_text类型" I"。

       ENDTRY。

     结局。

   终结法。



   方法get_all_data。



   终结法。



 ENDCLASS。



 CLASS model_one定义

   从lcl_controller继承。



   公共部分。

     类型:t_model的开始,

              名称TYPE字符串,
              secondname TYPE字符串,
            t_model的结尾。
     数据:wa_model TYPE t_model。

     方法构造函数。
     方法set_name
       IMPORTING!name TYPE字符串。

     方法get_name
       返回值(名称)TYPE字符串。

     方法set_secondname
       IMPORTING!secondname TYPE字符串。

     方法get_secondname
       返回值(第二名)TYPE字符串。
 ENDCLASS。



 CLASS model_one IMPLEMENTATION。
  METHOD构造函数。
     super-> constructor()。
  终结法。

   方法set_name。
     me-> wa_model-name =名称。
   终结法。

   方法get_name。
     名称= me-> wa_model-name。
   终结法。

   方法set_secondname。
     me-> wa_model-secondname =第二名。
   终结法。


   方法get_secondname。
     secondname =我-> wa_model-secondname。
   终结法。
 ENDCLASS。



 CLASS model_two DEFINITION
     从lcl_controller继承。
   公共部分。

     类型:开始于t_model_two,
              名称TYPE字符串,
              secondname TYPE字符串,
            t_model_two的结尾。
     数据:wa_model_two类型t_model_two。




  方法构造函数。

     方法set_name
       IMPORTING!name TYPE字符串。

     方法get_name
       返回值(名称)TYPE字符串。

     方法set_secondname
       IMPORTING!secondname TYPE字符串。

     方法get_secondname
       返回值(第二名)TYPE字符串。

 ENDCLASS。

 CLASS model_two IMPLEMENTATION。

   METHOD构造函数。
     super-> constructor()。
  终结法。
   方法set_name。
     me-> wa_model_two-name =名称。
   终结法。
   方法get_name。
     名称= me-> wa_model_two-name。
   终结法。

   方法set_secondname。
     me-> wa_model_two-secondname =第二名。
   终结法。

   方法get_secondname。
     secondname =我-> wa_model_two-secondname。
   终结法。
 ENDCLASS。


 类型:tt_model的开始,
          名称TYPE字符串,
          secondname TYPE字符串,
        tt_model的结尾。
 数据:lt_model类型tt_model。
 lt_model-name ='JHON'。
 lt_model-secondname ='PETER'。

 选择开始。


   DATA(lo_controller)=新的lcl_controller(model_name ='MODEL_ONE')。

   lo_controller-> set_all_data(it_table = lt_model)。

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好

我是Abap的新手,我想创建一个像控制器这样的父类,以及两个像模型一样的子类。

当我尝试创建动态类的对象来调用该方法时,我找不到解决方法。

这是我的代码示例,我知道我错过了一些事情。

*方法set_all_data。

DATA(方法名称)= | SET_ {组件->名称} |。

调用方法me->(方法名称)//
PARAMETER-TABLE参数。

*

当我通过名称class时,我想用me->代替该类的动态对象。

我希望任何人都能帮助我。

最佳

 CLASS lcl_controller定义
 *    上市
     创建公共。
   公共部分。

     方法构造函数
       导入model_name TYPE seoclsname。

     方法set_all_data
              导入model_name TYPE seoclsname可选
                        it_table TYPE数据可选。

     方法get_all_data。


   受保护的部分。
   专用部分。
     CLASS-DATA:lo_model类型REF TO对象,
                 lv_model TYPE seoclsname,
                 lt_table TYPE REF TO数据。

 ENDCLASS。



 类别lcl_controller的实现。

   METHOD构造函数。

     me-> lv_model = model_name。

 终结法。

   方法set_all_data。

     数据:struct_descr类型参考cl_abap_structdescr,
           参数TYPE abap_parmbind,
           参数TYPE abap_parmbind_tab。



     struct_descr = CAST cl_abap_structdescr(cl_abap_datadescr => describe_by_data(it_table))。



     环回struct_descr-> components引用到DATA(component)。

       清除参数。

       尝试。



           将ASSIGN COMPONENT组件->结构名称it_table转换为FIELD-SYMBOL()。

           如果sy-subrc = 0。

             参数名称=组件->名称。

             parameter-kind = cl_abap_objectdescr =>返回。

             将的引用获取到参数值中。



             INSERT参数INTO TABLE参数。

             DATA(方法名称)= | SET_ {组件->名称} |。



             呼叫方法me->(method_name)

               PARAMETER-TABLE参数。

           万一。



         捕获cx_sy_dyn_call_error INTO DATA(exc_ref)。

           DATA(exc_text)= exc_ref-> get_text()。

           消息exc_text类型" I"。

       ENDTRY。

     结局。

   终结法。



   方法get_all_data。



   终结法。



 ENDCLASS。



 CLASS model_one定义

   从lcl_controller继承。



   公共部分。

     类型:t_model的开始,

              名称TYPE字符串,
              secondname TYPE字符串,
            t_model的结尾。
     数据:wa_model TYPE t_model。

     方法构造函数。
     方法set_name
       IMPORTING!name TYPE字符串。

     方法get_name
       返回值(名称)TYPE字符串。

     方法set_secondname
       IMPORTING!secondname TYPE字符串。

     方法get_secondname
       返回值(第二名)TYPE字符串。
 ENDCLASS。



 CLASS model_one IMPLEMENTATION。
  METHOD构造函数。
     super-> constructor()。
  终结法。

   方法set_name。
     me-> wa_model-name =名称。
   终结法。

   方法get_name。
     名称= me-> wa_model-name。
   终结法。

   方法set_secondname。
     me-> wa_model-secondname =第二名。
   终结法。


   方法get_secondname。
     secondname =我-> wa_model-secondname。
   终结法。
 ENDCLASS。



 CLASS model_two DEFINITION
     从lcl_controller继承。
   公共部分。

     类型:开始于t_model_two,
              名称TYPE字符串,
              secondname TYPE字符串,
            t_model_two的结尾。
     数据:wa_model_two类型t_model_two。




  方法构造函数。

     方法set_name
       IMPORTING!name TYPE字符串。

     方法get_name
       返回值(名称)TYPE字符串。

     方法set_secondname
       IMPORTING!secondname TYPE字符串。

     方法get_secondname
       返回值(第二名)TYPE字符串。

 ENDCLASS。

 CLASS model_two IMPLEMENTATION。

   METHOD构造函数。
     super-> constructor()。
  终结法。
   方法set_name。
     me-> wa_model_two-name =名称。
   终结法。
   方法get_name。
     名称= me-> wa_model_two-name。
   终结法。

   方法set_secondname。
     me-> wa_model_two-secondname =第二名。
   终结法。

   方法get_secondname。
     secondname =我-> wa_model_two-secondname。
   终结法。
 ENDCLASS。


 类型:tt_model的开始,
          名称TYPE字符串,
          secondname TYPE字符串,
        tt_model的结尾。
 数据:lt_model类型tt_model。
 lt_model-name ='JHON'。
 lt_model-secondname ='PETER'。

 选择开始。


   DATA(lo_controller)=新的lcl_controller(model_name ='MODEL_ONE')。

   lo_controller-> set_all_data(it_table = lt_model)。
付费偷看设置
发送
5条回答
CJones
1楼-- · 2020-09-15 20:05

你不能这样吗?

创建对象lcl_controller TYPE model_one。

(如果您希望创建在超类内部进行,那么我个人会创建一个静态方法来这样做)

callcenter油条
2楼-- · 2020-09-15 20:10

如何在控制器类中创建动态对象属性:

 CLASS-DATA ZCL_MODEL TYPE TO OBJECT。

然后在方法构造器中,基于发送的类名称创建对象:

创建对象ZCL_MODEL类型(MODEL_NAME)。

之后,我认为您可以像这样直接调用该方法:

呼叫方法ZCL_MODEL->(METHOD_NAME)
参数表参数。
SKY徐
3楼-- · 2020-09-15 20:16

很抱歉,但是我认为这种方法比硬编码更好,甚至更好。为什么? 类必须是动态的,为什么不使用单个模型类并使数据访问动态?

 model-> set_element(i_name ='NAME'i_value ='SMITH')。
 模型-> set_all(i_structure = my_data)。

这里的优点是您有一个方法来设置一个值,而不是为每个需要动态调用的字段设置一个方法……看起来似乎不必要地复杂。

哎,真难
4楼-- · 2020-09-15 19:56

确实是我想要的但可以工作。 我宁愿将类的名称传递给构造函数,并从类的名称生成对象。 现在,我遇到了这样的错误。类LCL_MODEL_TWO中的方法SET_NAME尚未完成:参数类别对参数NAME不正确。

#set_all_data。
   DATA(方法名称)= | SET_ {组件->名称} |。
   调用METHOD我-> lo_model->((方法名)
              PARAMETER-TABLE参数。

开始选择。
  数据:model_name类型参考为lcl_model_two。
  创建对象:model_name。
  lt_model-name ='JHON'。
  lt_model-name ='PETER'。

   DATA(lo_controller)=新的lcl_controller(model_name = model_name)。
   lo_controller-> set_all_data(it_table = lt_model)。
 
昵称总是被占用
5楼-- · 2020-09-15 20:18

非常感谢您的帮助。

一周热门 更多>