以下ABAP程序抛出错误Statement is not accessible
。该程序包含一个接口和两个类:继承自c1
的c2
。语句CREATE OBJECT cref1.
中引发错误
REPORT z_upcast_downcast_objref.
INTERFACE i1.
DATA a1 TYPE i.
ENDINTERFACE. "i1
INTERFACE i2.
INTERFACES i1.
ALIASES a1 FOR i1~a1.
DATA a2 TYPE i.
ENDINTERFACE. "i2
CLASS c1 DEFINITION.
PUBLIC SECTION.
INTERFACES i2.
ENDCLASS. "c1 DEFINITION
CLASS c2 DEFINITION INHERITING FROM c1.
PUBLIC SECTION.
METHODS m1.
ENDCLASS. "c2 DEFINITION
CLASS c2 IMPLEMENTATION.
METHOD m1.
WRITE : / 'In c2->m1 method'.
ENDMETHOD. "c2
ENDCLASS. "c2 DEFINITION
DATA: iref TYPE REF TO i2,
cref1 TYPE REF TO c1,
cref2 TYPE REF TO c2.
CREATE OBJECT cref1.
TRY.
cref2 ?= iref.
CALL METHOD cref2->('M1').
CATCH cx_sy_move_cast_error
cx_sy_dyn_call_illegal_method.
ENDTRY.
编译器通知您它无法执行CREATE OBJECT
语句,因为它没有分配给隐式START-OF-SELECTION
块。这里有两个选项:
-
通过在创建对象
之前放置此行,将其分配给显式START-OF-SELECTION
块... START-OF-SELECTION. CREATE OBJECT cref1. ...
-
将
c2
类的实现放在报告的末尾。
附加:顺便说一句,你提出了一个我不知道的有趣问题。我在SCN(1,2,3)上发现了很多关于这个问题的报告,人们提出了正确的解决方案,但没有人能够以循证和充分论证的方式自信地解释它。但我终于可以做到了:)
尽管众所周知,所有非声明性语句都被分配给隐式SOS事件(如果没有声明其他事件),但当我们声明本地类时,这并不是的重点,以下是SAP对它的解释:
因此,实现部分在源代码中的位置不重要的然而,为了清楚起见,您应该将程序结束时本地类的实现部分,或者直接在相关定义部分之后。如果你做后者,请注意,然后必须分配后续的非声明性语句显式到处理块,如START-OF-SELECTION,以便它们可以被访问。