SAP-OO

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.

猜你喜欢

转载自blog.csdn.net/wx774891/article/details/109325260
oo
SAP