二维码

[面向对象] ABAP面向对象中的接口使用教程

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

接口与继承之间的区别:
  • 继承只能单继承,就是一个类只能有一个直接父类,而一个类可以实现多个接口
  • 一个类不能继承多个父类,而这个类又需要多种属性,这个时候就可以用接口了
  • 接口与类属于同一层次,实际上,接口是一种特殊的抽象类。

练习7 定义和使用接口
情景:一个旅游代理公司,是一个agency,对于每个旅游代理公司,会有各种各样的合作伙伴,包括酒店、航空公司、汽车公司等,对于这些不同类别的公司,代理公司与他们有一些标准化的业务,凡是符合这些业务标准的,都可以视为合作伙伴。
技术要求:建立类lcl_travel_agency,并定义接口lif_partner,来规定其合作伙伴应该具有的功能,修改lcl_carrier类,建立lcl_rental,符合接口,并写代码测试。
1、从 SAPBC401_VEHD_F中拷贝类lcl_rental  lcl_vehicle  lcl_truck的定义
2、完善lcl_carrier,使之符合接口规范
3、从SAPBC401_VEHT_MAIN_A拷贝代码,建立一些关于车辆的实例,并调用display_attributes方法显示内容。
4、从SAPBC401_VEHT_B中拷贝lcl_travel_agency的定义,并进行对应的修改
5、测试用lcl_travel_agency显示partner信息

执行效果:
abap面向对象中的接口使用方法.jpg

主程序代码:
  1. REPORT  ZBC10_EX_7.  "构造函数  主要用来在创建对象时初始化对象 即为对象成员变量赋初始值  重载
  2. INCLUDE ZBC10_EX_A_7.
  3. INCLUDE ZBC10_EX_B_7.
  4. INCLUDE ZBC10_EX_C_7.
  5. INCLUDE ZBC10_EX_E_7.
  6. INCLUDE ZBC10_EX_D_7.
  7. INCLUDE ZBC10_EX_F_7.

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

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

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

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

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

  29. R_CARRIER->DISPLAY_ATTRIBUTES( ).



  30. DATA: r_vehicle TYPE REF TO lcl_vehicle,
  31.       r_truck TYPE REF TO lcl_truck,
  32.       r_bus   TYPE REF TO lcl_bus,
  33.       r_rental TYPE REF TO lcl_rental.

  34. START-OF-SELECTION.
  35. *##########################

  36. ******* create rental *****************************************
  37.   CREATE OBJECT r_rental EXPORTING im_name = 'HAPPY CAR RENTAL'.

  38. ******* create truck *****************************************
  39.   CREATE OBJECT r_truck EXPORTING im_make = 'MAN'
  40.                                   im_cargo = 45.
  41.   r_rental->add_vehicle( r_truck ).
  42. ******* create truck *****************************************
  43.   CREATE OBJECT r_bus EXPORTING im_make = 'Mercedes'
  44.                                 im_passengers = 80.
  45.   r_rental->add_vehicle( r_bus ).
  46. ******* create truck *****************************************
  47.   CREATE OBJECT r_truck EXPORTING im_make = 'VOLVO'
  48.                                   im_cargo = 48.
  49.   r_rental->add_vehicle( r_truck ).

  50.   DATA: R_AGENCY TYPE REF TO lcl_travel_agency.
  51.   CREATE OBJECT R_AGENCY EXPORTING IM_NAME = 'XX'.
  52.   R_AGENCY->ADD_PARTNER( R_CARRIER ).
  53.   R_AGENCY->ADD_PARTNER( R_RENTAL ).

  54.   R_AGENCY->DISPLAY_AGENCY_PARTNERS( ).
复制代码
INCLUDE ZBC10_EX_A_7.
  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_7.
  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_7.
  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_E_7.
  1. *&---------------------------------------------------------------------*
  2. *&  Include           ZBC10_EX_E_7
  3. *&---------------------------------------------------------------------*

  4. *---------------------------------------------------------------------*
  5. * define interface lif_partners
  6. *
  7. * implement interface inside of lcl_rental
  8. *---------------------------------------------------------------------*
  9. INTERFACE lif_partners.
  10.   METHODS display_partner.
  11. ENDINTERFACE.                    "lif_partners

  12. *---------------------------------------------------------------------*
  13. *       CLASS lcl_vehicle DEFINITION
  14. *---------------------------------------------------------------------*
  15. CLASS lcl_vehicle DEFINITION.

  16.   PUBLIC SECTION.
  17.     "-------------------
  18.     METHODS: get_average_fuel IMPORTING im_distance TYPE s_distance
  19.                                         im_fuel TYPE s_capacity
  20.                               RETURNING value(re_avgfuel) TYPE s_consum.
  21.     METHODS       constructor IMPORTING im_make TYPE string.
  22.     METHODS       display_attributes.
  23.     METHODS       set_make IMPORTING im_make TYPE string.
  24.     METHODS       get_make EXPORTING ex_make TYPE string.
  25.     CLASS-METHODS get_count EXPORTING re_count TYPE i.

  26.   PRIVATE SECTION.
  27.     "-------------------
  28.     DATA: make   TYPE string.

  29.     METHODS      init_make.

  30.     CLASS-DATA:  n_o_vehicles TYPE i.

  31. ENDCLASS.                    "lcl_vehicle DEFINITION

  32. *---------------------------------------------------------------------*
  33. *       CLASS lcl_vehicle IMPLEMENTATION
  34. *---------------------------------------------------------------------*
  35. *
  36. *---------------------------------------------------------------------*
  37. CLASS lcl_vehicle IMPLEMENTATION.
  38.   METHOD get_average_fuel.
  39.     re_avgfuel = im_distance / im_fuel.
  40.   ENDMETHOD.                    "get_average_fuel

  41.   METHOD constructor.
  42.     make = im_make.
  43.     ADD 1 TO n_o_vehicles.
  44.   ENDMETHOD.                    "constructor

  45.   METHOD set_make.
  46.     IF im_make IS INITIAL.
  47.       init_make( ).   " me->init_make( ). also possible
  48.     ELSE.
  49.       make = im_make.
  50.     ENDIF.
  51.   ENDMETHOD.                    "set_make

  52.   METHOD init_make.
  53.     make = 'default make'.
  54.   ENDMETHOD.                    "init_make

  55.   METHOD get_make.
  56.     ex_make = make.
  57.   ENDMETHOD.                    "get_make

  58.   METHOD display_attributes.
  59.     WRITE: make.
  60.   ENDMETHOD.                    "display_attributes

  61.   METHOD get_count.
  62.     re_count = n_o_vehicles.
  63.   ENDMETHOD.                    "get_count

  64. ENDCLASS.                    "lcl_vehicle IMPLEMENTATION


  65. *---------------------------------------------------------------------*
  66. *       CLASS lcl_truck DEFINITION
  67. *---------------------------------------------------------------------*
  68. *
  69. *---------------------------------------------------------------------*
  70. CLASS lcl_truck DEFINITION INHERITING FROM lcl_vehicle.

  71.   PUBLIC SECTION.
  72.     "-------------------
  73.     METHODS:      constructor IMPORTING im_make TYPE string
  74.                                         im_cargo TYPE s_plan_car.

  75.     METHODS       display_attributes REDEFINITION.
  76.     METHODS       get_cargo RETURNING value(re_cargo) TYPE s_plan_car.

  77.   PRIVATE SECTION.
  78.     "-------------------
  79.     DATA: max_cargo TYPE s_plan_car.

  80. ENDCLASS.                    "lcl_truck DEFINITION

  81. *---------------------------------------------------------------------*
  82. *       CLASS lcl_truck IMPLEMENTATION
  83. *---------------------------------------------------------------------*
  84. *
  85. *---------------------------------------------------------------------*
  86. CLASS lcl_truck IMPLEMENTATION.

  87.   METHOD constructor.
  88.     super->constructor( im_make ).
  89.     max_cargo = im_cargo.
  90.   ENDMETHOD.                    "constructor

  91.   METHOD display_attributes.
  92.     WRITE: / icon_ws_truck AS ICON.
  93.     super->display_attributes( ).
  94.     WRITE: 20 ' Cargo = ', max_cargo.
  95.     ULINE.
  96.   ENDMETHOD.                    "display_attributes

  97.   METHOD get_cargo.
  98.     re_cargo = max_cargo.
  99.   ENDMETHOD.                    "get_cargo

  100. ENDCLASS.                    "lcl_truck DEFINITION


  101. *---------------------------------------------------------------------*
  102. *       CLASS lcl_bus DEFINITION
  103. *---------------------------------------------------------------------*
  104. *
  105. *---------------------------------------------------------------------*
  106. CLASS lcl_bus DEFINITION INHERITING FROM lcl_vehicle.

  107.   PUBLIC SECTION.
  108.     "-------------------
  109.     METHODS:      constructor IMPORTING im_make TYPE string
  110.                                         im_passengers TYPE i.

  111.     METHODS       display_attributes REDEFINITION.

  112.   PRIVATE SECTION.
  113.     "-------------------
  114.     DATA: max_passengers TYPE i.

  115. ENDCLASS.                    "lcl_bus DEFINITION

  116. *---------------------------------------------------------------------*
  117. *       CLASS lcl_bus IMPLEMENTATION
  118. *---------------------------------------------------------------------*
  119. *
  120. *---------------------------------------------------------------------*
  121. CLASS lcl_bus IMPLEMENTATION.

  122.   METHOD constructor.
  123.     super->constructor( im_make ).
  124.     max_passengers = im_passengers.
  125.   ENDMETHOD.                    "constructor

  126.   METHOD display_attributes.
  127.     WRITE: / icon_transportation_mode AS ICON.
  128.     super->display_attributes( ).
  129.     WRITE:  20 ' Passengers = ', max_passengers.
  130.     ULINE.
  131.   ENDMETHOD.                    "display_attributes


  132. ENDCLASS.                    "lcl_bus DEFINITION

  133. *---------------------------------------------------------------------*
  134. *       CLASS lcl_rental DEFINITION
  135. *---------------------------------------------------------------------*
  136. *
  137. *---------------------------------------------------------------------*
  138. CLASS lcl_rental DEFINITION.

  139.   PUBLIC SECTION.
  140.     "-------------------
  141.     METHODS:      constructor IMPORTING im_name TYPE string.
  142.     METHODS       add_vehicle IMPORTING im_vehicle
  143.                                   TYPE REF TO lcl_vehicle.
  144.     METHODS       display_attributes.
  145.     INTERFACES lif_partners.

  146.   PRIVATE SECTION.
  147.     "-------------------
  148.     DATA: name TYPE string,
  149.           vehicle_list TYPE TABLE OF REF TO lcl_vehicle.
  150. ENDCLASS.                    "lcl_rental DEFINITION

  151. *---------------------------------------------------------------------*
  152. *       CLASS lcl_rental IMPLEMENTATION
  153. *---------------------------------------------------------------------*
  154. *
  155. *---------------------------------------------------------------------*
  156. CLASS lcl_rental IMPLEMENTATION.

  157.   METHOD lif_partners~display_partner.
  158.     display_attributes( ).
  159.   ENDMETHOD.                    "lif_partners~display_partner

  160.   METHOD  constructor.
  161.     name = im_name.
  162.   ENDMETHOD.                    "constructor

  163.   METHOD  add_vehicle.
  164.     APPEND im_vehicle TO vehicle_list.
  165.   ENDMETHOD.                    "add_vehicle

  166.   METHOD  display_attributes.
  167.     DATA: r_vehicle TYPE REF TO lcl_vehicle.
  168.     WRITE: /  icon_transport_proposal AS ICON, name.
  169.     WRITE:  ' Here comes the vehicle list: '.
  170.     ULINE.
  171.     ULINE.
  172.     LOOP AT vehicle_list INTO r_vehicle.
  173.       r_vehicle->display_attributes( ).
  174.     ENDLOOP.
  175.   ENDMETHOD.                    "display_attributes

  176. ENDCLASS.                    "lcl_rental IMPLEMENTATION
复制代码
INCLUDE ZBC10_EX_D_7.
  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.     INTERFACES lif_partners.
  11.   PRIVATE SECTION.
  12.    DATA: NAME TYPE STRING,
  13.          AIRPLANE_LIST TYPE TABLE OF REF TO LCL_AIRPLANE.
  14. ENDCLASS.                    "lcl_CARRIER DEFINITION

  15. *----------------------------------------------------------------------*
  16. *       CLASS lcl_CARRIER IMPLEMENTATION
  17. *----------------------------------------------------------------------*
  18. *
  19. *----------------------------------------------------------------------*
  20. CLASS LCL_CARRIER IMPLEMENTATION.
  21.   METHOD CONSTRUCTOR.
  22.     NAME = IM_NAME.
  23.   ENDMETHOD.
  24.   METHOD ADD_AIRPLANE.
  25.     APPEND IM_AIRPLANE TO AIRPLANE_LIST.
  26.   ENDMETHOD.
  27.   METHOD DISPLAY_AIRPLANES.
  28.     DATA: R_AIRPLANE TYPE REF TO LCL_AIRPLANE.
  29.     LOOP AT AIRPLANE_LIST INTO R_AIRPLANE.
  30.        R_AIRPLANE->DISPLAY_ATTRIBUTES( ).
  31.     ENDLOOP.
  32.   ENDMETHOD.
  33.   METHOD DISPLAY_ATTRIBUTES.
  34.     WRITE: / NAME.
  35.     DISPLAY_AIRPLANES( ).
  36.   ENDMETHOD.
  37.   METHOD lif_partners~display_partner.
  38.     display_attributes( ).
  39.   ENDMETHOD.
  40. ENDCLASS.                    "lcl_CARRIER IMPLEMENTATION
复制代码
INCLUDE ZBC10_EX_F_7.
  1. *&---------------------------------------------------------------------*
  2. *&  Include           ZBC10_EX_F_7
  3. *&---------------------------------------------------------------------*
  4. *---------------------------------------------------------------------*
  5. *       CLASS lcl_travel_agency DEFINITION
  6. *---------------------------------------------------------------------*
  7. CLASS lcl_travel_agency DEFINITION.

  8.   PUBLIC SECTION.
  9.     "-------------------
  10.     METHODS:      constructor IMPORTING im_name TYPE string.
  11.     METHODS       add_partner IMPORTING IM_PARTNER TYPE REF TO LIF_PARTNERS.
  12.     METHODS       display_agency_partners.

  13.   PRIVATE SECTION.
  14.     "-------------------
  15.     DATA: name TYPE string.
  16.     DATA  partner_list TYPE TABLE OF REF TO LIF_PARTNERS.

  17. ENDCLASS.                    "lcl_travel_agency DEFINITION

  18. *---------------------------------------------------------------------*
  19. *       CLASS lcl_travel_agency IMPLEMENTATION
  20. *---------------------------------------------------------------------*
  21. CLASS lcl_travel_agency IMPLEMENTATION.

  22. METHOD display_agency_partners.
  23.    DATA: r_partner TYPE REF TO LIF_PARTNERS.
  24.    WRITE: icon_dependents AS ICON, name.
  25.    LOOP AT partner_list INTO r_partner.
  26.       r_partner->DISPLAY_PARTNER( ).
  27.    ENDLOOP.

  28. ENDMETHOD.                    "display_agency_partners

  29. METHOD  constructor.
  30.   name = im_name.
  31. ENDMETHOD.                    "constructor

  32. METHOD  add_partner.
  33.    APPEND IM_PARTNER TO partner_list.
  34. ENDMETHOD.                    "add_partner

  35. ENDCLASS.                    "lcl_travel_agency IMPLEMENTATION
复制代码
回复

使用道具 举报

快速回帖

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

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