点击此处---> 群内免费提供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)。
你不能这样吗?
创建对象lcl_controller TYPE model_one。
(如果您希望创建在超类内部进行,那么我个人会创建一个静态方法来这样做)
如何在控制器类中创建动态对象属性:
然后在方法构造器中,基于发送的类名称创建对象:
之后,我认为您可以像这样直接调用该方法:
很抱歉,但是我认为这种方法比硬编码更好,甚至更好。为什么? 类必须是动态的,为什么不使用单个模型类并使数据访问动态?
这里的优点是您有一个方法来设置一个值,而不是为每个需要动态调用的字段设置一个方法……看起来似乎不必要地复杂。
确实是我想要的但可以工作。 我宁愿将类的名称传递给构造函数,并从类的名称生成对象。 现在,我遇到了这样的错误。类LCL_MODEL_TWO中的方法SET_NAME尚未完成:参数类别对参数NAME不正确。
非常感谢您的帮助。
一周热门 更多>