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
类的外部 不支持访问 不支持访问 支持
类的内部 支持访问 支持访问 支持访问
子类 不支持访问 支持 支持

image-20220914111939430

类的方法#

方法定义#

定义一个学生类,学生类中有一些属性和方法

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传参方式类似,具体语法可以看下面这张图

注意在实现方法时不需要额外写方法参数

image-20220914133039599

方法调用#

* 实例化对象的方式
*方式一:先声明 然后使用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.

类的事件#

事件可以理解为是一个特殊的方法,可以通过事件进行两个类之间的交互

image-20220916095534995

image-20220916095928122

示例:

*&---------------------------------------------------------------------*
*& 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( ).
posted @   _fun_ny  阅读(182)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示
主题色彩