对于CALL METHOD-静态方法调用(作废),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。”
我在下面给出我的原始答案(顺便说一句,我想现在在CALL METHOD static_meth...
中,术语“独立方法调用”指的是“ static_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.
我想
CALL METHOD cl->m1( )
属于第一组构造,因此文档中有错误。可能缺少一个not,因为它应该应用于第二组构造(例如,
CALL METHOD method->method( )
无效)。我的结论:您应该阅读“如果未将CALL METHOD用于独立方法调用,则不可能进行链式方法调用...”
Florian&SAP的结论:在下面的评论中,Florian向SAP寻求支持,并指出SAP在文档的下一个正式版本中应使用的确切句子
附录(如果您错误地认为文档页面与“静态方法”有关,请阅读该文档,我希望我会明确指出并非如此)。
这个问题的答案证明documentation "CALL METHOD - Static Method Call (Obsolete)"相当令人困惑。
文档标题:此处的“静态方法调用”是指“方法的静态调用”,而不是“静态方法的调用”(而在其他地方,它可能具有此含义)。如果我们可以用书面语言加上括号,那将分别提供以下两种可能性:
静态(方法调用):方法的静态调用(无论此方法的类型为“静态”还是“实例”;我们可以对实例方法进行静态调用)
(静态方法)调用:调用静态方法
定义:
静态调用:类,接口或方法名称在源代码中被“硬编码”为符号,而不是文本文字,以便编译器可以识别它们(例如,
CALL METHOD class=>method.
)。相反,动态调用意味着名称是通过变量传递的,这些变量仅在运行时才知道(例如,DATA classvar TYPE seoclsname VALUE 'CL_ABAP_TYPEDESCR'. CALL METHOD (classvar)=>(methodvar).
)。另一个documentation page很好地表明“静态方法调用”与“动态方法调用”相对”,从不谈论“静态和实例方法”,仅谈论“静态方法调用”和“动态方法调用”。静态方法:用
CLASS-METHODS
声明的方法。例如,静态调用可以是cl_ixml=>create( )
,动态调用可以是DATA classvar TYPE seoclsname VALUE 'CL_IXML'. CALL METHOD (classvar)=>create
。文档中的一件事也使我感到困惑,是使用术语“静态方法”和仅基于静态方法的示例,因为实际上文档页面是关于“静态调用”的,而不是静态方法(可以使用实例方法) ):
语法:
CALL METHOD { static_meth( ) | static_meth( a ) | ...
:“ static_meth”在这里是什么意思?实际上,“ static_meth”并不意味着它是一个静态方法,而是在静态方法调用的上下文中的任何方法。如果查看有关“ static calls”和“ dynamic calls”的文档页面,您将看到语法分别为static_meth( ) ...
和CALL METHOD dynamic_meth ...
示例:三个调用中再次使用静态方法,这三个函数的确切含义相同,但使用不同的语法编写,以证明前两个调用已过时,建议仅使用第三个。实际上,所有这三个示例都应该更好地使用实例方法来避免混淆!
关于sap - 调用方法和方法链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54329867/