The documentation状态:函数方法的返回参数必须完全类型化。
在以下情况下,我尝试绕过该先决条件:
我有一个程序,用户在屏幕 1000 上选取一个对象,并可以在屏幕 2000 上对其进行各种更改。用户可以选取的对象有多种类型。该对象以ALV的形式呈现在屏幕2000上,其中列取决于对象的类型。无论对象类型如何,程序处理用户操作的方式基本相同。
程序的布局方式是:抽象类定义所有对象类型的默认行为,然后每个对象类型的子类在需要时重新定义方法。
处理对象数据的类具有方法get_data_ref()
。此方法从子类返回对私有(private)内部表的引用,其中包含对象的数据。该内部表在每个子类中使用不同的行类型进行声明。
抽象方法get_fieldcatalog()
返回给定对象类型的字段目录。该方法在每个子类中重新定义。
为了显示 ALV,我从 get_data_ref()
获取表引用,为其分配一个字段符号,并使用方法 SET_TABLE_FOR_FIRST_DISPLAY()
将字段符号传递给 ALV > 以及现场目录。
它有效。但这是错误的。
- 它可以通过以下方式直接访问我的类的私有(private)属性 引用它。私有(private)内部表可以从 在类之外,这违反了抽象原则。
- 安全吗?当指向内表的指针仍然存在时,内表是否可以从内存中释放?
有更好的方法吗?
最佳答案
我通过在 get_data()
方法中使用通用的 EXPORTING
参数而不是 RETURNING
参数解决了这个问题(如 建议) >Sandra Rossi)并通过单独的 GET_TABLEDESCR( )
方法返回 RTTS 对象。在调用类中,内部表是在运行时使用描述符对象键入的。
在调用类中:
DATA(lo_tabledescr) = go_data->GET_TABLEDESCR( ).
CREATE DATA lr_dref TYPE HANDLE lo_tabledescr.
ASSIGN lr_dref->* TO <lt_table>.
CHECK <lt_table> IS ASSIGNED.
go_data->GET_DATA( changing ct_data = <lt_table> ).
在go_data
类中:
METHOD GET_TABLEDESCR. " This method returns ro_descr TYPE REF TO cl_abap_tabledescr
DATA lo_structdescr TYPE REF TO cl_abap_structdescr.
lo_structdescr ?= CL_ABAP_STRUCTDESCR=>DESCRIBE_BY_NAME( P_NAME = 'your_linetype_name' ).
ro_descr = cl_abap_tabledescr=>GET(
exporting
P_LINE_TYPE = lo_structdescr " Row Type
).
ENDMETHOD.
关于generics - 返回各种类型的内部表的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74954504/