以下ABAP程序抛出错误Statement is not accessible
。
该程序包含一个接口和两个类:c2
继承自c1
。
语句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.
答案 0 :(得分:6)
编译器通知您它无法执行CREATE OBJECT
语句,因为它未分配给隐式START-OF-SELECTION
块。这里有2个选项:
通过在创建对象之前放置此行来将其分配给显式START-OF-SELECTION
块
...
START-OF-SELECTION.
CREATE OBJECT cref1.
...
将c2
课程的实施放在报告的末尾。
加法:顺便说一句,你提出了一个我不知道的有趣问题。我在SCN(1,2,3)上发现了一堆关于这个问题的报告,其中人们提出了正确的解决方案,但没有人能够自信地解释它,以证据为基础和良好的解决方案这种方式。但最后我能做到了:) 尽管众所周知,所有非声明性语句都被分配给隐式SOS事件(如果没有声明其他事件),当我们声明本地类时,这是不是,这里是如何它解释为by SAP:
因此,源代码中的实现部分的位置 不重要。但是,为了清楚起见,您应该全部放入 在程序结束时实现本地类的一部分,或者 直接在相关定义部分之后。如果你做后者, 请注意,您必须分配后续的非声明性语句 显式到处理块,例如START-OF-SELECTION,以便 他们可以访问。