*&---------------------------------------------------------------------*
*& Report Z_OO
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT z_oo.
"声明类 定义类中的项目
CLASS lcl_compt DEFINITION .
PUBLIC SECTION . "公有的部分
TYPES gty_char20 TYPE c LENGTH 20 .
TYPES gty_char5 TYPE c LENGTH 5 .
"实例属性
DATA gv_char TYPE c LENGTH 20 VALUE 'CHAR变量'.
"静态属性
CLASS-DATA gv_change TYPE gty_char20 . "静态属性
CLASS-DATA gv_CONCATENATE TYPE gty_char20 . "静态属性
CLASS-DATA gv_static TYPE c LENGTH 20 VALUE '静态属性'.
"实例方法
METHODS write_char .
METHODS write_instance .
METHODS set_value IMPORTING i_value TYPE gty_char20. "对gv_change变量赋值
METHODS get_value EXPORTING e_value TYPE gty_char20. "获取gv_change变量值
METHODS con_value IMPORTING i_value1 TYPE gty_char5 OPTIONAL "加 OPTIONAL 变成可选项
i_value2 TYPE gty_char5
i_value3 TYPE gty_char5
EXPORTING e_result TYPE gty_char5
e_message TYPE gty_char20 "多个参数
EXCEPTIONS no_zero .
METHODS ret_value IMPORTING i_value1 TYPE gty_char5 OPTIONAL "
i_value2 TYPE gty_char5
i_value3 TYPE gty_char5
RETURNING VALUE(e_subrc) TYPE gty_char20 .
"静态方法
CLASS-METHODS write_static .
PROTECTED SECTION . "受保护的部分
CLASS-DATA gv_super TYPE c LENGTH 20 VALUE 'PROTECTED SECTION'.
PRIVATE SECTION . "私有的部分
* CLASS-DATA gv_static TYPE c LENGTH 20 VALUE '静态属性'.
ENDCLASS .
"实现类 定义类中的方法的内容
CLASS lcl_compt IMPLEMENTATION .
METHOD write_char . "实例方法
WRITE :/'实例方法:', gv_char .
ENDMETHOD .
METHOD write_static . "静态方法
WRITE :/'静态方法:', gv_static .
ENDMETHOD .
METHOD write_instance . "实例方法
WRITE :/'实例方法调静态属性:', gv_static .
ENDMETHOD .
"实例之间值是相互独立的,所以 静态方法不能调实例属性
METHOD set_value .
gv_change = i_value .
ENDMETHOD .
METHOD get_value .
e_value = gv_change .
ENDMETHOD .
METHOD con_value .
CONCATENATE i_value1 i_value2 i_value3 INTO gv_CONCATENATE .
e_message = gv_CONCATENATE .
IF sy-subrc = 0.
e_result = 'S' .
ELSE .
e_result = 'E' .
ENDIF.
IF i_value1 IS INITIAL.
RAISE no_zero .
ENDIF.
ENDMETHOD .
METHOD ret_value .
CONCATENATE i_value1 i_value2 i_value3 INTO gv_CONCATENATE .
IF sy-subrc = 0.
e_subrc = 'S : ' && gv_CONCATENATE.
ELSE .
e_subrc = 'E' .
ENDIF.
ENDMETHOD .
ENDCLASS .
*------------------------------------------------------------------------
"声明一个对象
DATA lcl_object TYPE REF TO lcl_compt .
DATA lcl_object_2 TYPE REF TO lcl_compt .
START-OF-SELECTION .
CREATE OBJECT lcl_object. "实例化
CREATE OBJECT lcl_object_2. "实例化
*实例属性,在不同的实例之间独立 "值存在实例(与 lcl_object_2 互相独立)
WRITE: /'访问实例属性:' ,lcl_object->gv_char . "访问实例属性
* lcl_object->gv_char = '更换CHAR的值' .
CALL METHOD lcl_object->write_char. "实例1 的值
CALL METHOD lcl_object_2->write_char. "实例2 的值
* 静态属性不依附于实例 ”值存在类里
WRITE:/ '静态属性:' ,lcl_compt=>gv_static . "访问静态属性
* lcl_compt=>gv_static = '更改静态属性' .
CALL METHOD lcl_compt=>write_static. "静态方法
CALL METHOD lcl_object->write_instance. "实例方法调静态属性
CALL METHOD lcl_object_2->write_instance. "实例2 的值
*------------------调用单个参数传输---------------------------------------------------
DATA gv_data TYPE lcl_object->gty_char20 .
"带有参数的方法的调用
CALL METHOD lcl_object->set_value
EXPORTING
i_value = '赋值CHAR变量'.
CALL METHOD lcl_object->get_value
IMPORTING
e_value = gv_data.
WRITE: / gv_data .
*--------------------调用多个参数传输-------------------------------------------------
DATA gv_subrc TYPE lcl_object->gty_char5 .
DATA gv_message TYPE lcl_object->gty_char20 .
CALL METHOD lcl_object->con_value
EXPORTING
* i_value1 = 'ab'
i_value2 = 'cd'
i_value3 = 'ef'
IMPORTING
e_result = gv_subrc
e_message = gv_message
EXCEPTIONS
no_zero = 1.
IF sy-subrc = 1.
WRITE: / '不能为0' .
ELSE.
WRITE: / gv_subrc , '' ,gv_message.
ENDIF.
*--------------method 中的参数 (exporting 和 returning 的区别)------------------------------------------------------------------
* CALL METHOD lcl_object->ret_value
* EXPORTING
* i_value1 = '12'
* i_value2 = '34'
* i_value3 = '56'
* RECEIVING
* e_subrc = gv_message.
" returning 的简便写法
gv_message = lcl_object->ret_value( i_value1 = '12'
i_value2 = '34'
i_value3 = '56') .
WRITE: / gv_message.
*====================================================================
"继承类
CLASS lcl_sub DEFINITION INHERITING FROM lcl_compt.
PUBLIC SECTION.
METHODS write_super .
ENDCLASS .
CLASS lcl_sub IMPLEMENTATION .
METHOD write_super .
WRITE:/'PUBLIC:', gv_char . "共有部分的属性
WRITE:/'PROTECTED:', gv_super . "受保护部分的属性
* WRITE:/'PRIVATE:', gv_static . "私有部分的属性 错误
ENDMETHOD .
ENDCLASS .
DATA lcl_object_sub TYPE REF TO lcl_sub .
START-OF-SELECTION .
CREATE OBJECT lcl_object_sub. "实例化
CALL METHOD lcl_object_sub->write_super.
*===================================================================
CLASS lcl_compt2 DEFINITION .
PUBLIC SECTION .
TYPES gty_char30 TYPE c LENGTH 30 .
"构造器方法
METHODS constructor IMPORTING i_char TYPE gty_char30 .
PROTECTED SECTION .
PRIVATE SECTION .
ENDCLASS .
CLASS lcl_compt2 IMPLEMENTATION .
METHOD constructor .
WRITE :/ '执行了构造器函数:' .
WRITE : / i_char .
ENDMETHOD .
ENDCLASS .
"声明一个对象
DATA lcl_object2 TYPE REF TO lcl_compt2 .
DATA lcl_object3 TYPE REF TO lcl_compt2 .
START-OF-SELECTION .
"实例化的同时执行了构造器函数
* CREATE OBJECT lcl_object2. "实例化
CREATE OBJECT lcl_object2 "实例化
EXPORTING
i_char = '实例1'.
CREATE OBJECT lcl_object3 "实例化
EXPORTING
i_char = '实例2'.