CLASS class DEFINITION { DEFERRED [PUBLIC]} | LOAD

本文介绍了ABAP中类的两种定义方式:DEFERRED和LOAD。DEFERRED用于暂时定义未完成的类以便其他类引用,最终仍需实际定义;LOAD则从类别库加载已存在的类,便于使用其静态组件和事件处理器。

CLASS class DEFINITION { DEFERRED [PUBLIC]} | LOAD

1、CLASS class DEFINITION DEFERRED

在这个类未真正定义之前暂时定义,供其他类或者变量参照定义

注意:在程序中最后还是有该类的实际定义,否则激活会报错

CLASS class DEFINITION.
...
ENDCLASS.


2、CLASS class DEFINITION LOAD

从类别库载入该类,可使用其STATIC 组件或者Event Handler

CLASS cl_gui_cfw DEFINITION LOAD. 

DATA state LIKE cl_gui_cfw=>system_state. 

详细介绍可查看F1帮助

CLASS c1 DEFINITION DEFERRED. 

CLASS c2 DEFINITION. 
  PUBLIC SECTION. 
    DATA c1ref TYPE REF TO c1. 
ENDCLASS. 

CLASS c1 DEFINITION. 
  PUBLIC SECTION. 
    DATA c2ref TYPE REF TO c2. 
ENDCLASS. 

CLASS cl_gui_cfw DEFINITION LOAD. 

DATA state LIKE cl_gui_cfw=>system_state. 




<think>我们在讨论ABAP中的定义关键字DEFERRED。根据用户的问题,需要解释`CLASS lcl_event_handler DEFINITION DEFERRED`的含义和用法。 首先,DEFERRED关键字用于前向声明(forward declaration)。在ABAP中,如果两个相互引用(即循环依赖),例如A引用B,同时B也引用A,那么编译器在解析时会遇到问题,因为其中一个在另一个之前尚未定义。为了解决这个问题,ABAP提供了前向声明机制,允许先声明一个的存在,而不立即定义它,从而打破编译时的顺序依赖。 具体到`CLASS lcl_event_handler DEFINITION DEFERRED`,它的作用就是声明`lcl_event_handler`将在程序后面定义。这样,在声明之后,就可以在定义另一个之前使用这个的引用(如声明变量、参数等),只要这个的完整定义在程序后面出现即可。 例如,假设有两个:`lcl_event_receiver`和`lcl_event_handler`,它们需要相互引用。我们可以这样写: ```abap CLASS lcl_event_handler DEFINITION DEFERRED. " 前向声明 CLASS lcl_event_receiver DEFINITION. PUBLIC SECTION. METHODS: handle_event IMPORTING ir_handler TYPE REF TO lcl_event_handler. ENDCLASS. CLASS lcl_event_handler DEFINITION. PUBLIC SECTION. METHODS: process_event. ENDCLASS. ``` 在这个例子中,`lcl_event_receiver`的方法`handle_event`需要一个型为`REF TO lcl_event_handler`的参数。如果没有前向声明,编译器在解析`lcl_event_receiver`的定义时还不知道`lcl_event_handler`,因此会报错。通过前向声明,我们告诉编译器`lcl_event_handler`是一个将在后面定义的,从而允许引用。 需要注意的是: 1. 前向声明只适用于本地(local class),不适用于全局。 2. 前向声明后,的完整定义必须在同一程序单元(如同一个包含程序、函数组或池)中后续出现。 3. 在前向声明之后,只能使用该的引用型(REF TO)来声明变量、参数等,不能实例化或访问其成员,直到完整定义出现。 用户提供的引用内容中,引用[3]提到“Declare a reference variable before the class has been defined”,这正是前向声明的典型应用场景。在设置事件处理时,可能需要在一个中引用另一个尚未定义的,此时前向声明就非常有用。 另外,在用户提供的引用[1]中,有一个本地`lcl_event_receiver`的定义,如果这个需要引用另一个`lcl_event_handler`,而`lcl_event_handler`又在后面定义,那么就需要在`lcl_event_receiver`定义之前使用`CLASS lcl_event_handler DEFINITION DEFERRED`。 因此,总结如下: - 作用:解决之间的循环依赖,允许在定义之前声明的引用。 - 用法:在需要提前引用的位置之前使用`CLASS <class_name> DEFINITION DEFERRED`,然后在后续代码中完整定义该。 相关问题: 1. ABAP中除了DEFERRED,还有哪些处理循环依赖的方法? 2. 在ABAP全局中如何处理循环依赖? 3. 前向声明后,在的完整定义之前可以使用哪些操作?</think>### ABAP中定义关键字`DEFERRED`的作用详解 在ABAP中,`CLASS lcl_event_handler DEFINITION DEFERRED` 是一种**前向声明(forward declaration)**机制,主要用于解决之间的循环依赖问题。其核心作用是在尚未完整定义时,提前声明其存在性,使编译器能识别该的引用。 #### 关键作用 1. **解决循环依赖** 当两个需要相互引用时(如A引用B,同时B也引用A),直接定义会导致编译错误。通过`DEFERRED`声明,可打破这种循环依赖: ```abap " 前向声明B CLASS lcl_class_b DEFINITION DEFERRED. " 定义A(引用B) CLASS lcl_class_a DEFINITION. PUBLIC SECTION. METHODS: set_handler IMPORTING ir_handler TYPE REF TO lcl_class_b. " ✅ 允许引用 ENDCLASS. " 定义B(引用A) CLASS lcl_class_b DEFINITION. PUBLIC SECTION. METHODS: process IMPORTING ir_sender TYPE REF TO lcl_class_a. " ✅ 允许引用 ENDCLASS. ``` 2. **允许提前使用引用** 在完整定义前,可声明其引用变量(如`TYPE REF TO lcl_event_handler`),但**不能实例化或调用方法**(需等待完整定义)。 #### 典型应用场景 1. **事件处理** 在ALV Grid等UI控件的事件处理中,事件处理器(`lcl_event_handler`)常需引用控件,而控件又需引用处理器。通过`DEFERRED`声明可解决此问题: ```abap CLASS lcl_event_handler DEFINITION DEFERRED. " 前向声明 CLASS cl_gui_alv_grid DEFINITION. PUBLIC SECTION. EVENTS: onf4 FOR EVENT f4. METHODS: set_handler IMPORTING ir_handler TYPE REF TO lcl_event_handler. " ✅ 提前引用 ENDCLASS. CLASS lcl_event_handler DEFINITION. " 完整定义 PUBLIC SECTION. METHODS: handle_f4 FOR EVENT onf4 OF cl_gui_alv_grid. ENDCLASS. ``` 引用[1]中事件处理器的实现可能隐含此依赖[^1]。 2. **OOALV中的回调设计** 如引用[4]所示,ALV的`TOP_OF_PAGE`事件需动态文档对象与ALV Grid相互引用,此时`DEFERRED`可确保双向依赖合法[^4]。 #### 使用限制 - **仅限本地**:`DEFERRED`仅适用于程序内定义的本地(`lcl_*`),不适用全局(`CL_*`)。 - **不可实例化**:前向声明后,在完整定义前仅能声明引用,不能创建对象或访问方法。 - **强制完整定义**:前向声明的**必须在同一程序单元内后续完整定义**,否则引发编译错误。 #### 示例说明 ```abap REPORT demo_deferred. " 前向声明事件处理器 CLASS lcl_handler DEFINITION DEFERRED. " 定义服务(引用处理器) CLASS lcl_service DEFINITION. PUBLIC SECTION. METHODS: register_handler IMPORTING ir_handler TYPE REF TO lcl_handler. ENDCLASS. " 完整定义事件处理器(引用服务CLASS lcl_handler DEFINITION. PUBLIC SECTION. METHODS: handle_event IMPORTING ir_service TYPE REF TO lcl_service. ENDCLASS. ``` ### 总结 `DEFERRED`是ABAP处理间循环依赖的关键工具,通过前向声明: 1. ✅ 允许交叉引用 2. ✅ 解决编译顺序问题 3. ❌ 不解除运行时依赖(需自行管理对象生命周期) 它在事件处理、回调接口等场景中尤为重要,如ALV Grid(引用[1][^1])和动态文档(引用[4][^4])的实现。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值