Abap 调用方法和方法链接

Abap 调用方法和方法链接,abap,Abap,对于CALL METHOD-Static METHOD CALL(过时),ABAP关键字文档中说:“如果CALL METHOD用于独立方法调用,则不可能进行链接方法调用…” 尽管如此,下面的代码还是在7.40系统上愉快地执行。这不是一个独立方法调用的示例吗?或者,我做错了什么 REPORT ZUTEST3. CLASS class_parent Definition. PUBLIC Section. METHODS m1 returning value(r) type ref to

对于CALL METHOD-Static METHOD CALL(过时),ABAP关键字文档中说:“如果CALL METHOD用于独立方法调用,则不可能进行链接方法调用…”

尽管如此,下面的代码还是在7.40系统上愉快地执行。这不是一个独立方法调用的示例吗?或者,我做错了什么

REPORT ZUTEST3.

CLASS class_parent Definition.
   PUBLIC Section.
   METHODS m1 returning value(r) type ref to class_parent.
ENDCLASS.

CLASS class_parent Implementation. 
   Method m1.
       create object r.
       write / 'm1'.
   EndMethod.
ENDCLASS.

start-of-selection.
data cl type ref to class_parent.
CREATE OBJECT cl.
CALL METHOD cl->m1( )->m1( ).
编辑:免责声明


我们正在用Java编写一个分析和转换ABAP代码的工具。特别是,我们无意编写新的ABAP代码。但是,我们的工具必须处理所有ABAP,甚至是过时的语句和模糊的语法变体。此外,我想指出我不是ABAP专家。

2月23日,Florian在评论中给出了正确的答案:“我向docu团队报告了错误,他们回答说已经报告了错误,并在最新版本中更正了错误。新声明是:对于没有圆括号的第二个变量,链式方法调用是不可能的,并且不能使用运算符NEW和CAST。“

下面是我的原始答案(顺便说一句,我认为现在在
调用方法static\u meth…
中,“独立方法调用”一词指的是“static\u meth”部分,因此它指的是两组构造,因此我的答案不准确,SAP的答案是100%正确的)


如我所见,文档中说术语“独立方法调用”指的是这些结构(注意括号的使用),它们被宣布为过时:

CALL METHOD method( ).
CALL METHOD method( 25 ).
CALL METHOD method( a = 1 ).
CALL METHOD method( EXPORTING a = 1 ).
CALL METHOD instance->method( ).
CALL METHOD class=>method( ).
etc.
术语“独立方法调用”并不指这些构造:

CALL METHOD method.
CALL METHOD method EXPORTING a = 1.
CALL METHOD instance->method.
CALL METHOD class=>method.
etc.
我猜
调用方法cl->m1()
属于第一组构造,因此文档中有一个错误

可能缺少not,因为它应该应用于第二组构造(例如,
callmethodmethod->METHOD()
无效)

我的结论:您应该阅读“如果调用方法未用于独立方法调用,则不可能进行链式方法调用…”

Florian&SAP的结论:在下面的评论中,Florian请求SAP支持,并指出SAP在下一次正式发布文档时应使用哪句话


附录(如果您错误地认为文档页面是关于“静态方法”的,请阅读它,我希望我能明确说明它不是)

这个问题的答案证明了这个问题相当混乱

文档标题:这里的“静态方法调用”是指“静态方法调用”,而不是“静态方法调用”(在其他地方可能有此含义)。如果我们可以在书面语言中添加括号,这将分别提供以下两种可能性:

  • 静态(方法调用):方法的静态调用(无论此方法的类型是“静态”还是“实例”;我们都可以对实例方法进行静态调用)
  • (静态方法)调用:静态方法的调用
定义:

  • 静态调用:类、接口或方法名称在源代码中作为符号“硬编码”,而不是文本文本,因此编译器知道它们(例如,
    call method class=>method.
    )。相反,动态调用意味着名称通过变量传递,而这些变量只有在运行时才知道(例如,
    DATA classvar TYPE seoclsname VALUE'CL\u ABAP\u TYPEDESCR.CALL METHOD(classvar)=>(methodvar)。
    )这另一个很好地说明了“静态方法调用”与“动态方法调用”相反,它从不谈论“静态和实例方法”,只谈论“静态方法调用”和“动态方法调用”
  • 静态方法:使用
    类方法
    声明的方法。例如,静态调用可以是
    cl_ixml=>create()
    ,动态调用可以是
    数据类变量类型seoclsname值'cl_ixml'。调用方法(classvar)=>create
文档中有一点也让我感到困惑,那就是术语“静态方法”和仅基于静态方法的示例的使用,因为事实上文档页面是关于“静态调用”,而不是静态方法(可以使用实例方法):

  • 语法
    调用方法{static_meth()| static_meth(a)|……
    :这里的“static_meth”是什么意思?事实上,“static_meth”并不意味着它是一个静态方法,但它是静态方法调用上下文中的任何方法。如果您查看关于“和”的文档页面“,您将看到语法分别是
    static\u meth()…
    CALL METHOD dynamic\u meth…
  • 示例:在这三个调用中再次使用静态方法,这三个调用都具有相同的确切含义,但使用不同的语法编写,以证明前两个调用已过时,建议只使用第三个调用。事实上,这三个示例都应该更好地使用实例方法,以避免混淆加油

首先,在您的示例中,方法
m1
不是静态的,文档中的引用说明它是关于静态方法的(
CLASS-method

唯一可能的情况可能是本例中的情况

REPORT zutest3.

CLASS class_parent DEFINITION.
  PUBLIC SECTION.
    METHODS m1 RETURNING VALUE(r) TYPE REF TO class_parent.
    CLASS-METHODS m1_static RETURNING VALUE(r) TYPE REF TO class_parent.
ENDCLASS.

CLASS class_parent IMPLEMENTATION.
  METHOD m1.
    CREATE OBJECT r.
    WRITE / 'm1'.
  ENDMETHOD.

  METHOD m1_static.
    CREATE OBJECT r.
    WRITE / 'm2'.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
* this seems to be possible but no one sane calls a static method on an object reference
  CALL METHOD class_parent=>m1_static( )->m1_static( ).
* the following two are not possible and will not compile either
*  CALL METHOD class_parent=>m1_static( )=>m1_static( ).
*  class_parent=>m1_static( )=>m1_static( ).
第二,在本例中,
CALL方法
语句只是一个冗余,其作用只是提供信息

这两者是等价的

CALL METHOD cl->m1( ).
cl->m1( ).
与此类似,例如

DATA i TYPE i.
COMPUTE i = i + 1.
i = i + 1.

docu中有一个bug。我向docu团队报告了它,他们回答说它已经被报告了,他们在最新版本中更正了它

新的声明是:

对于没有圆括号的第二个变量,链式方法调用 不可能,请与操作员联系