generics - 返回各种类型的内部表的设计模式

标签 generics inheritance design-patterns abap abstraction

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/

相关文章:

java - JPA中的Id继承

c# - 这是众所周知的设计模式吗?它叫什么名字?

c# - 如何在 Startup.cs 中使用通用类型注册接口(interface)

c# - 具有通用元素和约束的通用接口(interface)

java - 在 java/scala 中覆盖整个类

ios - 从ios swift中的多个类库进行子类化

haskell "Non-Exhaustive pattern exception"

java 。关键字<这个>。迭代器模式

java - 用泛型实现父子关系

java - JobControl 和 JofConf.setMapperClass() 错误