美文网首页SAP ABAP
abap object-oriented–使用继承

abap object-oriented–使用继承

作者: 46b61a5f089d | 来源:发表于2018-07-12 07:53 被阅读4次

    在这一节中,我们来实现继承。

    背景:有两种飞机,一种是客机,一种是货机。显然他们都属于飞机的一种,所以按照对象抽象,得到父类。对于客机而言,有其特殊的属性即座位的数量,而对于货机,同样有特殊的属性能承载的最大重量。所以,原来父类的显示属性的方法不再适用,我们可以把这个方法定义为抽象方法(c++中的虚函数),也可以保留其共同的实现,在子类中重新定义该方法的实现。

    Uml图如下:

    *----------------------------------------------------------------------*
    
    * INCLUDE Z_SAMPLE_LCL_AIRPLANE *
    
    *----------------------------------------------------------------------*
    
    ******************************************
    
    * Definition part
    
    ******************************************
    
    CLASS lcl_airplane DEFINITION.
    
    *------------------------------
    
    * Public section
    
    *------------------------------
    
    PUBLIC SECTION.
    
    TYPES: t_name(25) TYPE c.
    
    METHODS:
    
    constructor importing im_name type t_name
    
    im_planetype TYPE saplane-planetype,
    
    display_attributes.
    
    * Static methods
    
    class-methods:
    
    display_n_o_airplanes.
    
    *------------------------------
    
    * Private section
    
    *------------------------------
    
    PRIVATE SECTION.
    
    * Private attributes
    
    DATA: name(25) TYPE c,
    
    planetype TYPE saplane-planetype.
    
    * Private static attribute
    
    CLASS-DATA n_o_airplanes TYPE i.
    
    ENDCLASS.
    
    ******************************************
    
    * Implementation part
    
    ******************************************
    
    CLASS lcl_airplane IMPLEMENTATION.
    
    METHOD constructor.
    
    * Counts number of instances
    
    n_o_airplanes = n_o_airplanes + 1.
    
    name = im_name.
    
    planetype = im_planetype.
    
    ENDMETHOD.
    
    METHOD display_attributes.
    
    WRITE:/ 'Name:', name, 'Planetype:', planetype.
    
    ENDMETHOD.
    
    METHOD display_n_o_airplanes.
    
    WRITE: / 'No. planes:', n_o_airplanes.
    
    ENDMETHOD.
    
    ENDCLASS.
    
    *----------------------------------------------------------------------*
    
    * INCLUDE Z_SAMPLE_LCL_PA_AIRPLANE *
    
    *----------------------------------------------------------------------*
    
    *******************************************************************
    
    * This is a subclass of class lcl_airplane
    
    *******************************************************************
    
    CLASS lcl_passenger_airplane DEFINITION INHERITING FROM lcl_airplane.
    
    PUBLIC SECTION.
    
    * The constructor contains the parameters from the superclass
    
    * plus the parameters from the subclass
    
    METHODS:
    
    constructor IMPORTING im_name TYPE t_name
    
    im_planetype TYPE saplane-planetype
    
    im_n_o_seats TYPE sflight-seatsmax,
    
    * Redefinition of superclass method display_attributes
    
    display_attributes REDEFINITION.
    
    PRIVATE SECTION.
    
    DATA: n_o_seats TYPE sflight-seatsmax.
    
    ENDCLASS.
    
    CLASS lcl_passenger_airplane IMPLEMENTATION.
    
    METHOD constructor.
    
    * The constructor method of the superclass MUST be called withing the
    
    * construtor
    
    CALL METHOD super->constructor
    
    EXPORTING im_name = im_name
    
    im_planetype = im_planetype.
    
    n_o_seats = im_n_o_seats.
    
    ENDMETHOD.
    
    * The redefined display_attributes method
    
    METHOD display_attributes.
    
    CALL METHOD super->display_attributes.
    
    WRITE: / 'No. seats:', n_o_seats.
    
    ENDMETHOD.
    
    ENDCLASS.
    
    *----------------------------------------------------------------------*
    
    * INCLUDE Z_SAMPLE_LCL_CA_AIRPLANE *
    
    *----------------------------------------------------------------------*
    
    *******************************************************************
    
    * This is a subclass of class lcl_airplane
    
    *******************************************************************
    
    CLASS LCL_CARGO_PLANE DEFINITION INHERITING FROM LCL_AIRPLANE.
    
    PUBLIC SECTION.
    
    METHODS:
    
    * The constructor contains the parameters from the superclass
    
    * plus the parameters from the subclass
    
    CONSTRUCTOR IMPORTING IM_NAME TYPE T_NAME
    
    IM_PLANETYPE TYPE SAPLANE-PLANETYPE
    
    IM_CARGOMAX TYPE SCPLANE-CARGOMAX,
    
    * Redefinition of superclass method display_attributes
    
    DISPLAY_ATTRIBUTES REDEFINITION.
    
    PRIVATE SECTION.
    
    DATA:CARGOMAX TYPE SCPLANE-CARGOMAX.
    
    ENDCLASS.
    
    *---------------------------------------------------------------------*
    
    * CLASS lcl_cargo_plane IMPLEMENTATION
    
    *---------------------------------------------------------------------*
    
    CLASS LCL_CARGO_PLANE IMPLEMENTATION.
    
    METHOD CONSTRUCTOR.
    
    * The constructor method of the superclass MUST be called withing the
    
    * constructor
    
    CALL METHOD SUPER->CONSTRUCTOR
    
    EXPORTING IM_NAME = IM_NAME
    
    IM_PLANETYPE = IM_PLANETYPE.
    
    CARGOMAX = IM_CARGOMAX.
    
    ENDMETHOD.
    
    METHOD DISPLAY_ATTRIBUTES.
    
    * The redefined display_attributes method
    
    CALL METHOD SUPER->DISPLAY_ATTRIBUTES.
    
    WRITE: / 'Cargo max:', CARGOMAX.
    
    ENDMETHOD.
    
    ENDCLASS.
    
    REPORT ZBOBO_OO_011 .
    
    * Super class
    
    Include z_sample_lcl_airplane.
    
    * Sub classes
    
    include z_sample_lcl_pa_airplane.
    
    include z_sample_lcl_ca_airplane.
    
    DATA:
    
    * Type ref to sub classes. Note: It is not necesssary to make typeref to
    
    * the superclass
    
    o_passenger_airplane TYPE REF TO lcl_passenger_airplane,
    
    o_cargo_plane TYPE REF TO lcl_cargo_plane.
    
    START-OF-SELECTION.
    
    * Display initial number of instances = 0
    
    CALL METHOD lcl_airplane=>display_n_o_airplanes.
    
    * Create objects
    
    CREATE OBJECT o_passenger_airplane
    
    EXPORTING
    
    im_name = 'LH505'
    
    im_planetype = 'Boing 747'
    
    im_n_o_seats = 350.
    
    CREATE OBJECT o_cargo_plane
    
    EXPORTING
    
    im_name = 'AR13'
    
    im_planetype = 'DC 3'
    
    im_cargomax = 35.
    
    * Display attributes
    
    CALL METHOD o_passenger_airplane->display_attributes.
    
    CALL METHOD o_cargo_plane->display_attributes.
    
    * Call static method display_n_o_airplanes
    
    * Note: The syntax for calling a superclass method, differs from the
    
    * syntax when calling a subclass method.
    
    * When calling a superclass => must be used instead of ->
    
    CALL METHOD lcl_airplane=>display_n_o_airplanes.
    

    相关文章

      网友评论

        本文标题:abap object-oriented–使用继承

        本文链接:https://www.haomeiwen.com/subject/tchlpftx.html