gra*_*m77 2 sap implementation abap class definition
以下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.
Run Code Online (Sandbox Code Playgroud)
编译器通知您它不能执行CREATE OBJECT语句,因为它未分配给隐式START-OF-SELECTION块.这里有2个选项:
START-OF-SELECTION通过在创建对象之前放置此行将其分配给显式块
...
START-OF-SELECTION.
CREATE OBJECT cref1.
...
Run Code Online (Sandbox Code Playgroud)将c2课程的实施放在报告的末尾.
另外:顺便说一下,你提出了一个我不知道的有趣问题.我发现了一堆关于SCN这个问题的报告(1,2,3),其中提出了乡亲正确的解决方案,但没有人能自信地解释,在以证据为基础和充分思考的方式.但最后我能做到这一点:)
尽管众所周知的事实,所有的非陈述语句被分配到隐SOS事件(如果没有其他事件的声明),这不是问题的关键,当我们声明局部类,这里SAP如何解释:
因此,源代码中实现部分的位置并不重要.但是,为了清楚起见,您应该将本地类的所有实现部分放在程序的末尾,或者直接放在相关的定义部分之后.如果您执行后者,请注意您必须将后续的非声明性语句 明确地分配给处理块,例如START-OF-SELECTION,以便可以访问它们.