1.T1
*&---------------------------------------------------------------------*
*& REPORT ZWXT_12
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zwxt_12.
*类的声明 类似接口
CLASS lcl_compt DEFINITION.
PUBLIC SECTION. "PUBLIC
TYPES: gty_char20 TYPE c LENGTH 20,
gty_p02 TYPE p LENGTH 6 DECIMALS 2,
gty_student TYPE ZWXSTUDENT_02,
gty_zcode TYPE ZWXSTUDENT_02-ZCODE.
"属性
DATA zname TYPE gty_char20 VALUE '张三'.
"静态属性
CLASS-DATA zname_static TYPE gty_char20 VALUE '李四'.
"无参构造方法
"METHODS constructor.
"有参构造方法
METHODS constructor IMPORTING i_costr TYPE gty_char20.
"方法
METHODS write_zname.
METHODS write_zname_private.
METHODS modify_zname_private.
METHODS concat_str IMPORTING str1 TYPE gty_char20 OPTIONAL "加了OPTIONAL的字段是可以不传入的,没加的则是必传的
str2 TYPE gty_char20
str3 TYPE gty_char20
EXPORTING gv_result TYPE gty_char20
gv_status TYPE c.
METHODS cal_circle IMPORTING i_pi TYPE gty_p02
i_r TYPE gty_p02
RETURNING VALUE(e_area) TYPE gty_p02
EXCEPTIONS no_zero.
METHODS get_data IMPORTING i_zcode TYPE gty_zcode.
"注册事件
EVENTS DATA_EXIST EXPORTING VALUE(I_STUDENT) TYPE gty_student.
"静态方法
CLASS-METHODS write_zname_static.
PROTECTED SECTION. "PROTECTED
DATA zname_protected TYPE c LENGTH 20 VALUE '父类名字'.
PRIVATE SECTION. "PRIVATE
"静态属性
DATA zname_private TYPE c LENGTH 20 VALUE '王五'.
ENDCLASS.
*类的实现
CLASS lcl_compt IMPLEMENTATION.
* METHOD constructor.
* WRITE:/ '无参构造器'.
* ENDMETHOD.
METHOD constructor.
WRITE:/ '有参构造器',i_costr.
ENDMETHOD.
METHOD write_zname.
WRITE:/ '实例方法:',zname.
ENDMETHOD.
METHOD write_zname_static.
WRITE:/ '静态方法:',zname_static.
ENDMETHOD.
METHOD write_zname_private.
WRITE:/ '私有变量:',zname_private.
ENDMETHOD.
METHOD modify_zname_private.
zname_private = '修改私有变量'. "封装的思想
ENDMETHOD.
METHOD concat_str.
CONCATENATE str1 str2 str3 INTO gv_result.
IF sy-subrc = 0.
gv_status = 'S'.
ELSE.
gv_status = 'E'.
ENDIF.
ENDMETHOD.
METHOD cal_circle.
IF i_r LE 0.
RAISE no_zero.
ENDIF.
e_area = i_pi * ( i_r ** 2 ).
ENDMETHOD.
METHOD get_data.
DATA LS_STUDENT TYPE ZWXSTUDENT_02.
SELECT
SINGLE *
INTO CORRESPONDING FIELDS OF LS_STUDENT
FROM ZWXSTUDENT_02
WHERE ZCODE = i_zcode.
IF SY-SUBRC = 0.
RAISE EVENT DATA_EXIST EXPORTING I_STUDENT = LS_STUDENT.
ELSE.
WRITE: /'zcode = ',I_ZCODE,'的学生不存在'.
ENDIF.
ENDMETHOD.
ENDCLASS.
*事件类编写
CLASS lcl_handler DEFINITION.
PUBLIC SECTION.
METHODS WRITE_DATA FOR EVENT DATA_EXIST OF lcl_compt
IMPORTING I_STUDENT.
ENDCLASS.
CLASS lcl_handler IMPLEMENTATION.
METHOD WRITE_DATA.
WRITE:/ I_STUDENT-ZCODE,I_STUDENT-ZNAME,I_STUDENT-ZSEX,I_STUDENT-ZSCHOOL,I_STUDENT-ZWEIGHT,I_STUDENT-ZUNIT.
ENDMETHOD.
ENDCLASS.
"子类进行继承 EXTENDS
CLASS lct_child DEFINITION INHERITING FROM lcl_compt.
PUBLIC SECTION.
"METHODS constructor.
METHODS write_super.
METHODS write_zname_private REDEFINITION. "重写父类的方法
ENDCLASS.
CLASS lct_child IMPLEMENTATION.
METHOD write_super.
WRITE:/'子类调用父类参数:',zname_protected.
ENDMETHOD.
METHOD write_zname_private.
WRITE:/'覆盖父类方法:hahhaha'.
CALL METHOD super->write_zname_private.
ENDMETHOD.
ENDCLASS.
*抽象类
CLASS lcl_abstract DEFINITION ABSTRACT.
PUBLIC SECTION.
METHODS write_one.
METHODS write_two ABSTRACT. "抽象方法
ENDCLASS.
CLASS lcl_abstract IMPLEMENTATION.
METHOD write_one.
WRITE:/ 'LCL_ABSTRACT ONE'.
ENDMETHOD.
ENDCLASS.
*定义接口
INTERFACE inter.
METHODS write_inter.
ENDINTERFACE.
CLASS lcl_impl DEFINITION INHERITING FROM lcl_abstract.
PUBLIC SECTION.
METHODS write_two REDEFINITION.
"引入接口
INTERFACES: inter.
ALIASES write_inter FOR inter~write_inter. "起个别名
ENDCLASS.
CLASS lcl_impl IMPLEMENTATION.
METHOD write_two.
WRITE:/ 'LCL_IMPL TWO'.
ENDMETHOD.
METHOD write_inter.
WRITE:/'LCL_IMPL INTERFACE'.
ENDMETHOD.
ENDCLASS.
"声明对象
DATA lct_object_01 TYPE REF TO lcl_compt.
DATA lct_object_02 TYPE REF TO lcl_compt.
DATA lct_child_01 TYPE REF TO lct_child.
"DATA lct_abstract_01 TYPE REF TO LCL_ABSTRACT.
DATA lct_impl_01 TYPE REF TO lcl_impl.
START-OF-SELECTION.
CREATE OBJECT lct_object_01 EXPORTING i_costr = 'ok'.
CREATE OBJECT lct_object_02 EXPORTING i_costr = 'fine'.
CREATE OBJECT lct_child_01 EXPORTING i_costr = 'sure'.
"CREATE OBJECT lct_abstract_01.
CREATE OBJECT lct_impl_01.
WRITE:/ '01-访问实例属性:',lct_object_01->zname.
WRITE:/ '01-访问静态属性:',lcl_compt=>zname_static.
CALL METHOD lct_object_01->write_zname.
lct_object_01->zname = '修改后的张三'.
lcl_compt=>zname_static = '修改的李四'.
ULINE.
WRITE:/ '02-访问实例属性:',lct_object_02->zname.
WRITE:/ '02-访问静态属性:',lcl_compt=>zname_static.
CALL METHOD lct_object_02->write_zname.
ULINE.
CALL METHOD lct_object_01->write_zname_private.
"LCT_OBJECT_01->ZNAME_PRIVATE = '尝试修改私有变量'.
CALL METHOD lct_object_01->modify_zname_private. "调用方法修改私有变量后
CALL METHOD lct_object_01->write_zname_private.
ULINE.
CALL METHOD lct_child_01->write_super.
CALL METHOD lct_child_01->write_zname_private.
ULINE.
DATA gv_result TYPE lct_object_01->gty_char20.
DATA gv_status TYPE c.
CALL METHOD lct_object_01->concat_str
EXPORTING "STR1 = 'ABC'
str2 = '-DEF'
str3 = '-GHI'
IMPORTING gv_result = gv_result
gv_status = gv_status.
WRITE:/ gv_result.
WRITE:/ gv_status.
ULINE.
DATA gv_area TYPE p LENGTH 6 DECIMALS 2.
DATA lv_pi TYPE p LENGTH 6 DECIMALS 2 VALUE '3.14'.
PARAMETERS p_r TYPE p LENGTH 6 DECIMALS 2.
"简便的写法
"gv_area = lct_object_01->cal_circle( i_pi = lv_pi i_r = p_r ).
CALL METHOD lct_object_01->cal_circle
EXPORTING i_pi = lv_pi
i_r = p_r
RECEIVING E_area = gv_area
EXCEPTIONS no_zero = 1.
WRITE:/'SY-SUBRC:', sy-subrc.
IF sy-subrc = 0.
WRITE: / 'R=',p_r,' AREA=',gv_area.
ENDIF.
ULINE.
"CALL METHOD lcL_abstract->WRITE_ONE.
CALL METHOD lct_impl_01->write_one.
CALL METHOD lct_impl_01->write_two.
CALL METHOD lct_impl_01->write_inter.
ULINE.
"事件的注册以及调用
DATA EVENT_HANDLER TYPE REF TO lcl_handler.
CREATE OBJECT EVENT_HANDLER.
SET HANDLER EVENT_HANDLER->WRITE_DATA FOR lct_object_01.
CALL METHOD lct_object_01->get_data
EXPORTING i_zcode = 101.