[SAP ABAP] 面向对象程序设计-类的访问区域
类在DEFINITION定义的过程有一个分区的概念,就是类中所定义的属性、方法等都必须定义在某个区域中
类的访问区域分为以下3种
PUBLIC | PROTECTED | PRIVATE | |
内部是否可见 | √ | √ | √ |
外部是否可见 | √ | X | X |
继承是否可见 | √ | √ | 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的注释打开,程序会报错