ABAP 面向对象系列之六

034_1600x1200_psd


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

背景:有两种飞机,一种是客机,一种是货机。显然他们都属于飞机的一种,所以按照对象抽象,得到父类。对于客机而言,有其特殊的属性即座位的数量,而对于货机,同样有特殊的属性能承载的最大重量。所以,原来父类的显示属性的方法不再适用,我们可以把这个方法定义为抽象方法(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.


About The Author

从事SAP行业有些年头,对SAP技术稍有了解; 如无特别声明,本博客文章为原创,转载请注明; 博主MSN:xuchunbo0901@hotmail.com; 博主邮箱:bob.xu@abaptech.com。

No Comments

Leave A Reply


注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。

无觅相关文章插件,快速提升流量