Abap 调用方法和方法链接
对于CALL METHOD-Static METHOD CALL(过时),ABAP关键字文档中说:“如果CALL METHOD用于独立方法调用,则不可能进行链接方法调用…” 尽管如此,下面的代码还是在7.40系统上愉快地执行。这不是一个独立方法调用的示例吗?或者,我做错了什么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
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”并不意味着它是一个静态方法,但它是静态方法调用上下文中的任何方法。如果您查看关于“和”的文档页面“,您将看到语法分别是调用方法{static_meth()| static_meth(a)|……
和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团队报告了它,他们回答说它已经被报告了,他们在最新版本中更正了它 新的声明是: 对于没有圆括号的第二个变量,链式方法调用 不可能,请与操作员联系