二维码

[面向对象] ABAP面向对象的多态使用教程

Twilight发表于 2014-02-22 17:14Twilight 最后回复于 2014-02-22 17:14 [复制链接] 4449 0

练习6 多态
1、不同子类的变量放到内表中,遍历,写入lcl_airplane类型的变量中,并逐个调用display_attributes方法,观察效果。
  1. CLASS lcl_carrier DEFINITION.

  2.   PUBLIC SECTION.
  3.     "----------------------------------------
  4.     METHODS: constructor IMPORTING im_name TYPE string,
  5.              get_name RETURNING value(ex_name) TYPE string,
  6.              add_airplane,
  7.              display_airplanes,
  8.              display_attributes.

  9.   PRIVATE SECTION.
  10.     "-----------------------------------
  11.     DATA: name              TYPE string,
  12.           airplane_list  TYPE TABLE OF REF TO lcl_airplane.
  13. ENDCLASS.                    "lcl_carrier DEFINITION


  14. CLASS lcl_carrier IMPLEMENTATION.

  15.   METHOD add_airplane.

  16.   ENDMETHOD.                    "add_airplane

  17.   METHOD display_attributes.
  18.     WRITE: / name .

  19.   ENDMETHOD.                    "display_attributes
复制代码
2、定义类lcl_carrier 代码如下
3、编写以下方法的代码
Add_airplane  将飞机增加到飞机列表属性,传输中使用lcl_airplane类
Display_airplanes 遍历airplane_list,调用每个airplane的display_attributes方法
Display_attributes   显示所有的属性,包括显示name和显示航班列表
4、建立一个lcl_carrier的实例
将之前建立的飞机对象加到这个对象的airplane_list中
调用display_attributes属性,显示列表
执行效果:
abap面向对象中的多态使用方法.jpg
主程序代码:
  1. REPORT  ZBC10_EX_6.  "构造函数  主要用来在创建对象时初始化对象 即为对象成员变量赋初始值  重载
  2. INCLUDE ZBC10_EX_A_6.
  3. INCLUDE ZBC10_EX_B_6.
  4. INCLUDE ZBC10_EX_C_6.
  5. INCLUDE ZBC10_EX_D_6.

  6. DATA:R_AIRPLANE TYPE REF TO LCL_AIRPLANE, "相当于结构
  7.      RT_AIRPLANE TYPE TABLE OF REF TO LCL_AIRPLANE. "相当于内表
  8. DATA:R_PASSENGER_PLANE TYPE REF TO LCL_PASSENGER_PLANE,
  9.      R_CARGO_PLANE TYPE REF TO LCL_CARGO_PLANE,
  10.      R_CARRIER TYPE REF TO LCL_CARRIER.

  11. START-OF-SELECTION. "面向对象必须写,面向过程可以不写
  12. CREATE OBJECT R_CARRIER EXPORTING IM_NAME = 'AA'.
  13. CREATE OBJECT R_AIRPLANE EXPORTING IM_NAME = '001'
  14.                                    IM_PLANETYPE = '747-400'.
  15. R_CARRIER->ADD_AIRPLANE( R_AIRPLANE ).

  16. CREATE OBJECT R_AIRPLANE EXPORTING IM_NAME = '002'
  17.                                    IM_PLANETYPE = '747-500'.
  18. R_CARRIER->ADD_AIRPLANE( R_AIRPLANE ).

  19. CREATE OBJECT R_PASSENGER_PLANE EXPORTING IM_NAME = '003'
  20.                                           IM_PLANETYPE = '747-400'
  21.                                           IM_MAXSEATS = '200'.
  22. R_CARRIER->ADD_AIRPLANE( R_PASSENGER_PLANE ).

  23. CREATE OBJECT R_CARGO_PLANE EXPORTING IM_NAME = '004'
  24.                                       IM_PLANETYPE = '747-400'
  25.                                       IM_MAXCARGO = '300'.
  26. R_CARRIER->ADD_AIRPLANE( R_CARGO_PLANE ).

  27. R_CARRIER->DISPLAY_ATTRIBUTES( ).
复制代码
INCLUDE ZBC10_EX_A_6.
  1. *&---------------------------------------------------------------------*
  2. *&  Include           ZBC10_EX_A
  3. *&---------------------------------------------------------------------*
  4. CLASS LCL_AIRPLANE DEFINITION.
  5.   PUBLIC SECTION.
  6.     METHODS:CONSTRUCTOR IMPORTING IM_NAME TYPE  STRING
  7.                                   IM_PLANETYPE TYPE SAPLANE-PLANETYPE.
  8.     CLASS-METHODS:DISPLAY_N_O_AIRPLANES.
  9.     METHODS:DISPLAY_ATTRIBUTES.
  10.   PROTECTED SECTION.
  11.     DATA:NAME TYPE  STRING,
  12.          PLANETYPE TYPE SAPLANE-PLANETYPE.
  13.     CLASS-DATA:N_0_ARIPLANES TYPE I.
  14.     METHODS:GET_TECHNICAL_ATTRIBUTES IMPORTING IM_TYPE TYPE SAPLANE-PLANETYPE
  15.                                      EXPORTING EX_WEIGHT  TYPE S_PLAN_WEI
  16.                                                EX_TANKCAP TYPE   S_CAPACITY.
  17. ENDCLASS.                    "LCL_AIRPLANE DEFINITION

  18. *----------------------------------------------------------------------*
  19. *       CLASS LCL_AIRPLANE IMPLEMENTATION
  20. *----------------------------------------------------------------------*
  21. *
  22. *----------------------------------------------------------------------*
  23. CLASS LCL_AIRPLANE IMPLEMENTATION.
  24.   METHOD CONSTRUCTOR.
  25.     NAME = IM_NAME.
  26.     PLANETYPE = IM_PLANETYPE.
  27.     N_0_ARIPLANES = N_0_ARIPLANES + 1.
  28.   ENDMETHOD.                    "SET_ATTRIBUTES
  29.   METHOD DISPLAY_N_O_AIRPLANES.
  30.     WRITE: / 'Number of airplanes:',N_0_ARIPLANES.
  31.   ENDMETHOD.                    "DISPLAY_N_O_AIRPLANES
  32.   METHOD DISPLAY_ATTRIBUTES.
  33.     DATA:WEIGHT  TYPE S_PLAN_WEI,
  34.          TANKCAP TYPE   S_CAPACITY.
  35.     ME->GET_TECHNICAL_ATTRIBUTES( EXPORTING IM_TYPE = PLANETYPE    "在类里引用自身的方法用ME  这里的EXPORTING相当于IMPORTING 相反的
  36.                                   IMPORTING EX_WEIGHT = WEIGHT
  37.                                             EX_TANKCAP = TANKCAP ).
  38.     WRITE: / 'name',NAME,'planetype',PLANETYPE,'weight',WEIGHT,'tankcap',TANKCAP.
  39.   ENDMETHOD.                    "display_attributes
  40.   METHOD GET_TECHNICAL_ATTRIBUTES.
  41.     SELECT SINGLE WEIGHT TANKCAP
  42.       INTO (EX_WEIGHT,EX_TANKCAP)
  43.       FROM SAPLANE
  44.       WHERE PLANETYPE = IM_TYPE.
  45.     IF SY-SUBRC NE 0.
  46.       EX_WEIGHT = 0.
  47.       EX_TANKCAP = 0.
  48.     ENDIF.
  49.   ENDMETHOD.                    "GET_TECHNICAL_ATTRIBUTES
  50. ENDCLASS.                    "LCL_AIRPLANE IMPLEMENTATION
复制代码
INCLUDE ZBC10_EX_B_6.
  1. *&---------------------------------------------------------------------*
  2. *&  Include           ZBC10_EX_B_5
  3. *&---------------------------------------------------------------------*
  4. CLASS LCL_PASSENGER_PLANE DEFINITION INHERITING FROM LCL_AIRPLANE.
  5.   PUBLIC SECTION.
  6.     METHODS:CONSTRUCTOR IMPORTING IM_NAME TYPE  STRING
  7.                                   IM_PLANETYPE TYPE SAPLANE-PLANETYPE
  8.                                   IM_MAXSEATS TYPE  SAPLANE-SEATSMAX.
  9.     METHODS DISPLAY_ATTRIBUTES REDEFINITION.
  10.   PRIVATE SECTION.
  11.     DATA:  MAXSEATS TYPE SAPLANE-SEATSMAX.

  12. ENDCLASS.                    "lcl_passenger_plane DEFINITION
  13. CLASS LCL_PASSENGER_PLANE IMPLEMENTATION.
  14.   METHOD CONSTRUCTOR.
  15.     SUPER->CONSTRUCTOR( IM_NAME = IM_NAME IM_PLANETYPE = IM_PLANETYPE ).
  16.     MAXSEATS = IM_MAXSEATS.
  17.   ENDMETHOD.
  18.   METHOD DISPLAY_ATTRIBUTES.
  19.    SUPER->DISPLAY_ATTRIBUTES( ).
  20.    WRITE: 'MAXSEAT',MAXSEATS.
  21.   ENDMETHOD.
  22. ENDCLASS.
复制代码
INCLUDE ZBC10_EX_C_6.
  1. *&---------------------------------------------------------------------*
  2. *&  Include           ZBC10_EX_C_5
  3. *&---------------------------------------------------------------------*
  4. CLASS LCL_CARGO_PLANE DEFINITION INHERITING FROM LCL_AIRPLANE.
  5.   PUBLIC SECTION.
  6.     METHODS:CONSTRUCTOR IMPORTING IM_NAME TYPE  STRING
  7.                                   IM_PLANETYPE TYPE SAPLANE-PLANETYPE
  8.                                   IM_MAXCARGO TYPE  SAPLANE-CAP_UNIT.
  9.     METHODS DISPLAY_ATTRIBUTES REDEFINITION.
  10.   PRIVATE SECTION.
  11.     DATA:MAX_CARGO TYPE SAPLANE-CAP_UNIT.

  12. ENDCLASS.                    "lcl_cargo_plane DEFINITION
  13. *----------------------------------------------------------------------*
  14. *       CLASS LCL_CARGO_PLANE IMPLEMENTATION
  15. *----------------------------------------------------------------------*
  16. *
  17. *----------------------------------------------------------------------*
  18. CLASS LCL_CARGO_PLANE IMPLEMENTATION.
  19.   METHOD CONSTRUCTOR.
  20.     SUPER->CONSTRUCTOR( IM_NAME = IM_NAME IM_PLANETYPE = IM_PLANETYPE ).
  21.     MAX_CARGO = IM_MAXCARGO.
  22.   ENDMETHOD.                    "CONSTRUCTOR
  23.   METHOD DISPLAY_ATTRIBUTES.
  24.     SUPER->DISPLAY_ATTRIBUTES( ).
  25.     WRITE: 'MAXCARGO',MAX_CARGO.
  26.   ENDMETHOD.                    "DISPLAY_ATTRIBUTES
  27. ENDCLASS.                    "LCL_CARGO_PLANE IMPLEMENTATION
复制代码
INCLUDE ZBC10_EX_D_6.
  1. *&---------------------------------------------------------------------*
  2. *&  Include           ZBC10_EX_D_6
  3. *&---------------------------------------------------------------------*
  4. CLASS LCL_CARRIER DEFINITION.
  5.   PUBLIC SECTION.
  6.     METHODS:CONSTRUCTOR IMPORTING IM_NAME TYPE STRING.
  7.     METHODS:ADD_AIRPLANE IMPORTING IM_AIRPLANE TYPE REF TO LCL_AIRPLANE.
  8.     METHODS:DISPLAY_AIRPLANES.
  9.     METHODS:DISPLAY_ATTRIBUTES.
  10.   PRIVATE SECTION.
  11.    DATA: NAME TYPE STRING,
  12.          AIRPLANE_LIST TYPE TABLE OF REF TO LCL_AIRPLANE.
  13. ENDCLASS.                    "lcl_CARRIER DEFINITION

  14. *----------------------------------------------------------------------*
  15. *       CLASS lcl_CARRIER IMPLEMENTATION
  16. *----------------------------------------------------------------------*
  17. *
  18. *----------------------------------------------------------------------*
  19. CLASS LCL_CARRIER IMPLEMENTATION.
  20.   METHOD CONSTRUCTOR.
  21.     NAME = IM_NAME.
  22.   ENDMETHOD.
  23.   METHOD ADD_AIRPLANE.
  24.     APPEND IM_AIRPLANE TO AIRPLANE_LIST.
  25.   ENDMETHOD.
  26.   METHOD DISPLAY_AIRPLANES.
  27.     DATA: R_AIRPLANE TYPE REF TO LCL_AIRPLANE.
  28.     LOOP AT AIRPLANE_LIST INTO R_AIRPLANE.
  29.        R_AIRPLANE->DISPLAY_ATTRIBUTES( ).
  30.     ENDLOOP.
  31.   ENDMETHOD.
  32.   METHOD DISPLAY_ATTRIBUTES.
  33.     WRITE: / NAME.
  34.     DISPLAY_AIRPLANES( ).
  35.   ENDMETHOD.
  36. ENDCLASS.                    "lcl_CARRIER IMPLEMENTATION
复制代码
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表