sap - 调用方法和方法链接

标签 sap abap

对于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/

相关文章:

按该表的特定字段对动态表进行排序

Android kSOAP : Invoke WebService on SAP for complex parameter

linux - 在 ubuntu 上安装 sap

java - Derby 嵌入式驱动程序错误 XBM02 请确保您的类路径包含正确的 Derby 软件

database - 如何配置我的 Microsoft Access 数据库以直接从 SAP BW 中提取源数据?

database - ABAP数据簇是如何存储在数据库中的?

abap - 为什么类型不兼容?

sap - 在 SAP 中通过 RFC 读取结构的内容

abap - 新的 ABAP 语法而不是 COLLECT

abap - ABAP 开发时间估计