ABAP面向对象
ABAP的类有两种类型:
- 局部类 :只能在当前程序中使用
- 全局类:可以在所有ABAP程序中使用
可以根据子例程和function model之间的关系来区分局部类和全局类的区别
局部类#
局部类分为两个部分
- 定义部分
- 实现部分
类的定义#
CLASS student DEFINITION.
PUBLIC SECTION.
data:...
class-data:...
methods:....
class-methods:...
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
可以看到一个类分为三个部分,学习过Java的同学很好理解,这就相当于Java的权限的修饰符
PRIVATE | PROTECTED | PUBLIC | |
---|---|---|---|
类的外部 | 不支持访问 | 不支持访问 | 支持 |
类的内部 | 支持访问 | 支持访问 | 支持访问 |
子类 | 不支持访问 | 支持 | 支持 |
类的方法#
方法定义#
定义一个学生类,学生类中有一些属性和方法
CLASS student DEFINITION.
PUBLIC SECTION.
DATA: name TYPE char10,
age TYPE i,
class TYPE char10.
*CLASS-DATA:
METHODS: study,
eat,
sleep,
set_name IMPORTING name TYPE char10 ,
get_name EXPORTING name TYPE char10 .
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS student IMPLEMENTATION.
METHOD study.
WRITE '学习'.
ENDMETHOD.
METHOD eat.
WRITE '正在吃饭'.
ENDMETHOD.
METHOD sleep.
WRITE '正在睡觉'.
ENDMETHOD.
METHOD set_name.
me->name = name.
ENDMETHOD.
METHOD get_name.
name = me->name.
ENDMETHOD.
ENDCLASS.
可以看到方法的传参方式和子例程或者function model传参方式类似,具体语法可以看下面这张图
注意在实现方法时不需要额外写方法参数
方法调用#
* 实例化对象的方式
*方式一:先声明 然后使用creat object 关键字
DATA zhangsan TYPE REF TO student.
CREATE OBJECT zhangsan.
*方式二:调用构造方法实例化
DATA(xiaowang) = NEW student( )."推荐的写法
zhangsan->sleep( ).
* 方法调用的两种方式
* 方式一:通过符号调用(推荐)更加简洁
zhangsan->set_name( EXPORTING name = 'zhangsan' ).
DATA zhangsan_name TYPE char10.
zhangsan->get_name( IMPORTING name = zhangsan_name ).
*方式二:使用关键字调用
DATA xiaowang_name TYPE char10.
CALL METHOD xiaowang->set_name
EXPORTING name = 'xiaowang'.
CALL METHOD xiaowang->get_name
IMPORTING name = xiaowang_name.
构造器#
作用和Java中的构造方法相同
-
没有返回值
-
不需要显示调用
-
每个类只能有一个构造方法
还是上面这个类,在创建对象时为改对象的三个属性赋值,me
就相当于Java中的this
指针
提到了me这个关键字,那这里还有另外一个关键字 super,可以用来指向父类
*声明
METHODS constructor IMPORTING name TYPE char10 age TYPE i class TYPE char10.
*实现
METHOD constructor.
me->name = name.
me->age = age.
me->class = class.
ENDMETHOD.
类的事件#
事件可以理解为是一个特殊的方法,可以通过事件进行两个类之间的交互
示例:
*&---------------------------------------------------------------------*
*& Report YMMR0006
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ymmr0006.
* class事件练习
*定义一个类,里面有一个获取数据的方法,当获取方法成功,使用事件输出数据,
*否则输出'数据获取失败'
CLASS sflight_data DEFINITION.
PUBLIC SECTION.
METHODS get_data.
"定义事件,在这个类中不需要实现事件的处理逻辑 且只能使用exporting导出参数
EVENTS:print_data EXPORTING VALUE(data) TYPE sflight.
ENDCLASS.
CLASS sflight_data IMPLEMENTATION.
METHOD get_data.
SELECT SINGLE * FROM sflight INTO @DATA(table) .
IF sy-subrc = 0.
* 触发事件
RAISE EVENT print_data EXPORTING data = table.
ELSE.
WRITE :/'数据获取失败'.
ENDIF.
ENDMETHOD.
ENDCLASS.
CLASS event_handler DEFINITION.
PUBLIC SECTION.
"声明这个方法是为上面的事件处理的具体逻辑,
METHODS write_data FOR EVENT print_data OF sflight_data "print_data是原类的事件名称,sflight_data是原类的名称
IMPORTING data. "data的名称要和事件声明的形参保持一致 注意参数方向是相反的
ENDCLASS.
CLASS event_handler IMPLEMENTATION.
METHOD write_data .
WRITE: / data-carrid, data-fldate ,data-currency.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
* 分别实例化两个对象
data(flight) = new sflight_data( ).
data(handler) = new event_handler( ).
*注册事件
SET HANDLER HANDLER->write_data for flight.
*调用方法,测试事件是否会被触发
flight->get_data( ).
接口#
定义方式#
INTERFACE inter.
METHODS get_get.
ENDINTERFACE.
接口实现类#
CLASS cla DEFINITION.
*一般声明在public部分
PUBLIC SECTION.
INTERFACES inter.
ENDCLASS.
CLASS cla IMPLEMENTATION.
"方法实现
METHOD inter~get_get. "指明是实现接口的方法"
WRITE 'get_data...'.
ENDMETHOD.
ENDCLASS.
* 调用类实现接口的方法
data(cla) = new cla( ).
cla->inter~get_get( ).
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具