当前位置: 首页 > article >正文

[SAP ABAP] 面向对象程序设计-类的访问区域

类在DEFINITION定义的过程有一个分区的概念,就是类中所定义的属性、方法等都必须定义在某个区域中

类的访问区域分为以下3种

PUBLICPROTECTEDPRIVATE
内部是否可见
外部是否可见XX
继承是否可见X

类的访问区域

PUBLIC SECTION 公有部分可以直接被(自己/子类/外界)访问
PROTECTED SECTION 保护部分可以被(自己/子类)访问
PRIVATE SECTION 私有部分不能被其他类访问,只可以被自己访问

提示Tips:在声明部分,PUBLIC SECTION 必须在 PRIVATE SECTION 前面

例1

REPORT z437_test_2025.

* 父类
CLASS lcl_c1 DEFINITION.
  PROTECTED SECTION.   " 若此处是private访问修饰符,将不能被lcl_c2继承,会报错
    DATA: lv_num TYPE i.
ENDCLASS.

* 子类
CLASS lcl_c2 DEFINITION INHERITING FROM lcl_c1. " lcl_c2 继承 lcl_c1
  PUBLIC SECTION.
    METHODS: set_data IMPORTING p_imp TYPE i,
             get_data EXPORTING p_exp TYPE i.
ENDCLASS.

CLASS lcl_c2 IMPLEMENTATION.
  METHOD set_data.
    lv_num = p_imp.
  ENDMETHOD.

  METHOD get_data.
    p_exp = lv_num + 1.
  ENDMETHOD.
ENDCLASS.


START-OF-SELECTION.
  " 定义变量
  DATA: go_cref TYPE REF TO lcl_c2.
  DATA: gv_data TYPE i.

  " 创建实例
  CREATE OBJECT go_cref.

  CALL METHOD go_cref->set_data
    EXPORTING
      p_imp = '10'.

  CALL METHOD go_cref->get_data
    IMPORTING
      p_exp = gv_data.

  WRITE: / gv_data.

输出结果:

如果将父类lcl_c1 DEFINITION区域中的PROTECTED SECTION更改为PRIVATE SECTION,将不能被lcl_c2继承,程序会报错

例2

REPORT z437_test_2025.

CLASS lcl_c1 DEFINITION.
  PUBLIC SECTION.
    METHODS: set_data IMPORTING p_imp TYPE i,
             get_data EXPORTING p_exp TYPE i.

*  PROTECTED SECTION.        ” 删掉注释会报错
    DATA: lv_num TYPE i.
ENDCLASS.

CLASS lcl_c1 IMPLEMENTATION.
  METHOD set_data.
    lv_num = p_imp.
  ENDMETHOD.

  METHOD get_data.
    p_exp = lv_num + 1.
  ENDMETHOD.
ENDCLASS.


START-OF-SELECTION.
  " 定义变量
  DATA: go_cref TYPE REF TO lcl_c1.
  DATA: gv_data TYPE i.

  " 创建实例
  CREATE OBJECT go_cref.

  CALL METHOD go_cref->set_data
    EXPORTING
      p_imp = '10'.

  WRITE: 'Set_data method:',go_cref->lv_num.

  CALL METHOD go_cref->get_data
    IMPORTING
      p_exp = gv_data.

  WRITE: / 'get_data method:', gv_data.

输出结果:

如果将上述lcl_c1 DEFINITION区域中的PRIVATE SECTION的注释打开,程序会报错


http://www.kler.cn/a/534891.html

相关文章:

  • Linux命令总结
  • Deno vs Node.js:性能对比深度解析
  • java项目全局拦截器
  • HTML5 教程之标签(3)
  • simpleQtLogger日志库的使用
  • 手写MVVM框架-环境搭建
  • 【React】合成事件语法
  • 防静电监控看板如何助力生产线提升品质管理效率
  • C语言基础系列【4】C语言基础语法
  • 深度剖析 C++17 中的 std::byte:解锁字节级编程新境界
  • PHP JSON操作指南
  • uniapp使用uts插件调用原生API
  • 鸿蒙 Next 开发实践:使用 WebView 适配移动端网站
  • JAVA异步的UDP 通讯-客户端
  • 云端IDE如何重定义开发体验
  • VS Code Python 开发环境配置
  • Linux环境下的事件驱动力量:探索Libevent的高性能IO架构
  • Java 中接口和抽象类的异同
  • Hive之数据操作DML
  • 神经网络常见激活函数 3-ReLU函数(修正线性单元)
  • 网络安全--边界安全-防火墙
  • Java 中的 Spring 框架,以及 Spring Boot 和 Spring Cloud 的区别?
  • 2025.2.6总结
  • opentelemetry-collector 配置prometheus
  • ssh中公钥和私钥怎么生成
  • Markdown介绍与语法