【问题标题】:"Statement is not accessible" error after declaration of local classes声明本地类后出现“语句不可访问”错误
【发布时间】:2016-09-10 15:34:50
【问题描述】:

以下 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.

【问题讨论】:

  • 确切的错误信息是什么?

标签: class abap implementation definition


【解决方案1】:

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

  1. 通过在创建对象之前放置这一行将其分配给显式 START-OF-SELECTION

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

补充:顺便说一句,你提出了一个我不知道的有趣问题。我在 SCN (1,2,3) 上发现了一堆关于这个问题的报告,人们提出了正确的解决方案,但没有人能以基于证据和充分论证的方式自信地解释它。但我终于可以做到了:)
尽管众所周知的事实是所有非声明性语句都分配给隐式 SOS 事件(如果没有声明其他事件),这不是我们声明本地类时的重点,这里是如何这是解释by SAP

实现部分在源代码中的位置是这样的 不重要。但是,为了清楚起见,您应该将所有 程序结束时本地类的实现部分,或 直接在相关定义部分之后。如果你做后者, 请注意,您必须随后分配后续的非声明性语句 显式到诸如 START-OF-SELECTION 之类的处理块,以便 可以访问它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 2013-05-18
    • 2013-04-23
    • 2022-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多