ABAP本地类面向对象编程实战:实现数据管理与ALV展示
业务场景与需求分析
在SAP ABAP开发中,本地类(Local Class)常用于封装特定报表或程序内的业务逻辑,以提高代码的可读性和可维护性。本文将通过一个图书信息管理的实际场景,演示如何定义和实现一个包含私有属性、实例方法以及静态方法的本地类,并结合现代ABAP语法进行对象实例化与调用。
具体需求如下:
- 定义一个本地类用于管理图书的名称与出版社信息。
- 在私有区域定义自定义结构体及标准内表,用于存储图书数据。
- 使用私有实例变量和静态变量分别记录当前对象的图书数量与全局图书总数。
- 提供公有实例方法用于录入图书数据并以ALV网格形式展示。
- 提供公有静态方法用于输出全局统计的图书总数。
本地类的定义 (Definition)
在类的定义部分,我们需要划分公有(Public)和私有(Private)区域。公有区域暴露给外部调用的方法,而私有区域则封装数据结构和内部状态。这里我们使用了现代ABAP的内联声明和更简洁的语法结构。
CLASS lcl_book_manager DEFINITION.
PUBLIC SECTION.
METHODS:
add_book
IMPORTING
iv_title TYPE string
iv_publisher TYPE string,
display_books.
CLASS-METHODS:
display_total_count.
PRIVATE SECTION.
TYPES:
BEGIN OF ty_book,
title TYPE string,
publisher TYPE string,
END OF ty_book.
DATA:
mt_books TYPE STANDARD TABLE OF ty_book,
ms_book TYPE ty_book,
mv_book_count TYPE i.
CLASS-DATA:
mv_total_books TYPE i.
ENDCLASS.
本地类的实现 (Implementation)
在实现部分,我们具体编写业务逻辑。录入方法负责将传入的参数赋值给工作区并追加至内表,同时更新计数器。展示方法采用了面向对象的ALV工厂类 CL_SALV_TABLE 来替代传统的函数模块,使代码更加精简。静态方法则使用 CL_DEMO_OUTPUT 来直观地展示统计数据。
CLASS lcl_book_manager IMPLEMENTATION.
METHOD add_book.
ms_book-title = iv_title.
ms_book-publisher = iv_publisher.
APPEND ms_book TO mt_books.
" 更新实例计数与静态全局计数
mv_book_count = mv_book_count + 1.
mv_total_books = mv_total_books + 1.
CLEAR ms_book.
ENDMETHOD.
METHOD display_books.
TRY.
" 使用现代ALV工厂类生成并展示表格
cl_salv_table=>factory(
IMPORTING
r_salv_table = DATA(lo_alv)
CHANGING
t_table = mt_books ).
lo_alv->display( ).
CATCH cx_salv_msg INTO DATA(lx_msg).
MESSAGE lx_msg->get_text( ) TYPE 'I'.
ENDTRY.
ENDMETHOD.
METHOD display_total_count.
" 使用Demo Output类展示静态统计数据
cl_demo_output=>display(
data = mv_total_books
text = '当前系统录入的图书总数'
).
ENDMETHOD.
ENDCLASS.
对象实例化与方法调用
在程序的执行入口 START-OF-SELECTION 中,我们将创建类的实例并调用相关方法。ABAP 提供了多种实例化对象的方式,包括传统的 CREATE OBJECT 以及更现代的 NEW 关键字结合隐式类型声明(Inline Declaration)。
START-OF-SELECTION.
" 1. 使用 NEW 关键字与隐式声明创建对象实例
DATA(lo_manager) = NEW lcl_book_manager( ).
" 2. 调用实例方法录入数据
lo_manager->add_book(
iv_title = 'ABAP 面向对象编程实战'
iv_publisher = '电子工业出版社'
).
lo_manager->add_book(
iv_title = 'SAP 系统架构与底层原理'
iv_publisher = '机械工业出版社'
).
" 3. 调用实例方法展示ALV数据
lo_manager->display_books( ).
" 4. 通过类名直接调用静态方法
lcl_book_manager=>display_total_count( ).
" 5. 使用 NEW 关键字创建匿名实例并直接调用静态方法
NEW lcl_book_manager( )->display_total_count( ).