【问题标题】:Method call as a parameter for another method call?方法调用作为另一个方法调用的参数?
【发布时间】:2015-03-13 11:21:41
【问题描述】:

我是abap(OO)的新手,但之前在java中开发并编写了一个abap“cl_caretaker”类,它应该处理对数据库表及其本地副本(实习表)的操作。

我想进行以下方法调用:

caretaker->show_table( caretaker->get_users( ) ) .

与:

 caretaker = cl_caretaker=>get_instance( ). "singleton instance

METHODS:

"! get a list of all user which registrated for FCP
"!
"! @parameter rt_users    | users which are registrated for FCP
   get_users
      RETURNING value(rt_users) TYPE itty_users,


 "! shows the content of a table
 "!
 "! @parameter it_table             | the table we want to visualize
   show_table
      IMPORTING
        value(it_table) TYPE ANY TABLE.

如果我将调用一分为二并将 get_users 的结果存储在一个 tmp 变量中,它就可以工作。

DATA:
  gt_tmp_users TYPE caretaker->itty_users.

  gt_tmp_users = caretaker->get_users( ).
  caretaker->show_table( gt_tmp_users ).

所以我的问题是:

1) 是这样的调用:caretaker->show_table( caretaker->get_users( ) ). 可能,如果如何?

2) 我还尝试创建一个通用变量,用于存储各种表格。 因为我不想为每个表类型创建我使用 tmp/help 变量。 但我得到的信息是,只有(德语:Formalparameter)方法定义的虚拟参数被允许为泛型类型(例如,TYPE any TABLE)。

这里有一些我已经尝试过的东西:

DATA:
*    tmpanytable TYPE TABLE OF any.
*    tmpAnyTable TYPE any.
    tmpanytable TYPE REF TO data.

 " needed to store a temporal table
 FIELD-SYMBOLS: <tmpanytable> TYPE ANY TABLE.

* ASSIGN caretaker->get_users( ) TO <tmpAnyTable>.
* <tmpAnyTable> = caretaker->get_users( ).
* caretaker->get_users( ).
*caretaker->show_table( <tmpAnyTable> ).
*caretaker->show_table( caretaker->get_users( ) ).

*CALL METHOD: caretaker->show_table( IMPORTING it_table = caretaker->get_users ).
*CALL METHOD: caretaker->show_table( it_table = caretaker->get_users( ) ).

*COMPUTE caretaker->show_table( it_table = caretaker->get_users( ) ).

*ASSIGN caretaker->get_users() ->* to <tmpAnyTable>.
*Caretaker->show_table( <tmpAnyTable> ).

*call METHOD caretaker->show_table
*                Exporting It_table = caretaker->get_users( ).

*  CREATE DATA tmpanytable TYPE STANDARD TABLE OF (dbtab)
*                            WITH NON-UNIQUE DEFAULT KEY.
*  ASSIGN tmpanytable->* TO <tmpanytable>.

*  CREATE DATA tmpanytable TYPE tabkind OF any Table .
*  ASSIGN tmpanytable->* TO <tmpanytable>.

*GET REFERENCE OF caretaker->get_users() INTO tmpAnyTable.
*caretaker->show_table( tmpAnyTable ) .

【问题讨论】:

  • 您使用的是哪个 SAP_ABA 版本?
  • 软件组件:SAP_ABA 版本:701 级别:0004 最高支持包:SAPKA70104

标签: oop methods parameters abap


【解决方案1】:

Method chaining 是可能的,methods in operand positions 也是可能的,但您至少需要 SAP_ABA 702。

您可以使用泛型类型在运行时不知道其类型的情况下传递表。但是,您不能在不知道其类型的情况下创建表。将其与 OO 原则相比,您可以处理对抽象超类的引用并在组件之间传递它们,但您不能实例化抽象超类。 CREATE DATA 语句需要一个“具体数据类型”才能工作,而不是“抽象超类型STANDARD TABLE”。这里的难点在于决定谁知道类型并创建数据对象。

顺便说一句,您可能想看看内置的Object Services - 也许没有必要再次重新发明数据库访问层轮子。

【讨论】:

  • 感谢您的回答和提示。 - “方法链接”的示例看起来像 Builder Design Pattern,但我问的不是嵌套方法为了。 - 但我会仔细看看“对象服务”。
  • 德语维基百科中的方法或表达式链接信息http://de.wikipedia.org/wiki/ABAP#Seit_Release_7.1_.2F_7.02
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2022-01-22
  • 2018-09-03
  • 1970-01-01
相关资源
最近更新 更多