Class &引用;“无法访问对账单”;声明本地类后出错

Class &引用;“无法访问对账单”;声明本地类后出错,class,abap,implementation,definition,Class,Abap,Implementation,Definition,以下ABAP程序抛出错误语句不可访问。 该程序包含一个接口和两个类: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. EN

以下ABAP程序抛出错误
语句不可访问
。 该程序包含一个接口和两个类:
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.

编译器通知您,它无法执行
CREATE OBJECT
语句,因为它未分配给隐式
START-OF-SELECTION
块。这里有两个选项:

  • 通过在创建对象之前放置此行,将其分配给显式
    选择开始块

    ...
    START-OF-SELECTION.
    
    CREATE OBJECT cref1.
    ...
    
  • c2
    类的实现放在报告的末尾

  • 添加:顺便说一句,你提出了一个我不知道的有趣问题。我在SCN(,)上找到了一大堆关于这个问题的报告,其中人们提出了正确的解决方案,但没有人能够自信地以基于证据和充分论证的方式解释它。但最后我能做到:)
    尽管众所周知,所有非声明性语句都被分配给隐式SOS事件(如果没有声明其他事件),但这不是我们声明本地类时的重点,下面是如何解释的:

    因此,实现部分在源代码中的位置是 不重要。但是,为了清楚起见,您应该 程序结束时本地类的实现部分,或 直接在相关定义部分之后。如果你选择后者, 请注意,然后必须分配后续的非声明性语句 显式地到处理块,例如开始选择,以便 可以访问它们


    确切的错误消息是什么?