OO ABAP Example

OO ABAP Example


Define, implement and use simple class

***INCLUDE ZBC404_HF_LCL_AIRPLANE .
******************************************

* Definition part

******************************************

CLASS lcl_airplane DEFINITION.
*------------------------------

* Public section

*------------------------------

PUBLIC SECTION.
    TYPES: t_name(25) TYPE c.
    METHODS:
     constructor,
     set_attributes IMPORTING p_name       TYPE t_name
                              p_planetype  TYPE saplane-planetype,
      display_attributes,
      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.
  ENDMETHOD.
 
  METHOD set_attributes.
    name      = p_name.
    planetype = p_planetype.
  ENDMETHOD.
 
  METHOD display_attributes.
    WRITE:/ 'Name:', name, 'Planetype:', planetype.
  ENDMETHOD.
 
  METHOD display_n_o_airplanes.
    WRITE: / 'No. planes:', n_o_airplanes.
  ENDMETHOD.
 
ENDCLASS.
REPORT zbc404_hf_maintain_airplanes .
 
INCLUDE zbc404_hf_lcl_airplane.
 
* Create reference to class lcl_airplane
DATA: airplane1 TYPE REF TO lcl_airplane,
      airplane2 TYPE REF TO lcl_airplane.
 
START-OF-SELECTION.
 
* Create instance
  CREATE OBJECT airplane1.
  CALL METHOD: airplane1->display_n_o_airplanes.
 
  CREATE OBJECT airplane2.
 
* Setting attributes using a method with parameters
  CALL METHOD airplane1->set_attributes EXPORTING p_name      = 'Kurt'
                                                  p_planetype = 'MD80'.
END-OF-SELECTION.
* Using methods 
  CALL METHOD: airplane1->display_n_o_airplanes,
               airplane1->display_attributes.  
  
The resulting report:
Maintain airplanes                                     

No. planes: 1

No. planes: 2

Name: Kurt Planetype: MD80

Use constructor to create an object with parameters
CLASS lcl_airplane DEFINITION.
  PUBLIC SECTION.
    TYPES: t_name(25) TYPE c.
METHODS:
      constructor    importing p2_name      type t_name
                               p2_planetype  TYPE saplane-planetype,
..... more code .......
CLASS lcl_airplane IMPLEMENTATION.
  METHOD constructor.
    name      = p2_name.
    planetype = p2_planetype.
..... more code .......
START-OF-SELECTION.
  CREATE OBJECT airplane1 exporting p2_name = 'Hansemand'

p2_planetype = 'Boing 747'.

                                                       

Subclassing

This example uses a superclass LCL_AIRPLANE and subclasses it into LCL_PASSENGER_AIRPLANE and LCL_CARGO_PLANE.

LCL_AIRPLANE has a method display_n_o_airplanes that displays the number of object instances.

LCL_PASSENGER_AIRPLANE has the private instance attribute n_o_seats, and redefines the superclass method display_attributes,
so it also displays n_o_seats.

LCL_CARGO_PLANE has the private instance attribute cargomax, and redefines the superclass method
display_attributes, so it also displays cargomax.

All instance attributes are provided by the cunstructor method.

Superclass LCL_AIRPLANE

***INCLUDE ZBC404_HF_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.
 
 

*------------------------------

* Protected section

*------------------------------

  PROTECTED 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.
    name      = im_name.
    planetype = im_planetype.
 
 

*   Counts number of instances
    n_o_airplanes = n_o_airplanes + 1.
  ENDMETHOD.
 
 

  METHOD display_attributes.
    WRITE:/ 'Name:', name, 'Planetype:', planetype.
  ENDMETHOD.
 
 

  METHOD display_n_o_airplanes.
    WRITE: / 'No. planes:', n_o_airplanes.
  ENDMETHOD.
 
 

ENDCLASS.

Sub class LCL_PASSENGER_AIRPLANE

***INCLUDE ZBC404_HF_LCL_PASSENGER_PLANE .
 
 

*******************************************************************

* 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.
Sub class LCL_CARGO_PLANE
***INCLUDE ZBC404_HF_LCL_CARGO_PLANE .

*******************************************************************

* 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.
  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.

The Main program that uses the classes

REPORT zbc404_hf_main .
* Super class
INCLUDE zbc404_hf_lcl_airplane.
* Sub classes
INCLUDE zbc404_hf_lcl_passenger_plane.
INCLUDE zbc404_hf_lcl_cargo_plane.
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.

Result:

No. planes: 0
Name: LH505 Planetype: Boing 747
No. seats: 350
Name: AR13 Planetype: DC 3
Cargo max: 35,0000
No. planes: 2

Polymorphism

Polymorphism: When the same method is implemented differently in different classes. This can be done u
sing enheritance, by redefining a method from the superclass in subclasses and implement it differently.

Classes:

  • lcl_airplane Superclass
  • lcl_cargo_airplane Subclass
  • lcl_passenger_airplane Subclass

The method estimate_fuel_consumption is implemented differently in the 3 classes, as it depends on the airplane type.

Object from different classes are stored in an internal table (plane_list) consisting of references to the 
superclass, and the processed 

identically for all the classes. 
What coding for the estimate_fuel_consumption method taht is actually executed, depends on the dynamic 
type of the plane reference variable,

 that is, depends on which object plane points to.
DATA: cargo_plane            TYPE REF to lcl_cargo_airplane,

          passenger_plane    TYPE REF to lcl_passenger_airplane,

          plane_list                  TYPE TABLE OF REF TO lcl_airplane.
* Creating the list of references

CREATE OBJECT cargo_plane.

APPEND cargo_plane to plane_list.

CREATE OBJECT passenger_plane

APPEND passenger_plane to plane list.
* Generic method for calucalting required fuel

METHOD calculate required_fuel.

  DATA: plane TYPE REF TO lcl_airplane.
  LOOP AT plane_list INTO plane.

    re_fuel = re_fuel + plane->estimate_fuel_consumption( distance ).

  ENDLOOP.

ENDMETHOD.
Working example:
This example assumes that the classes lcl_airplane,  lcl_passnger_airplane and lcl_cargo plane exists.
Create objects of type lcl_cargo_plane and lcl_passenger_airplane, adds them to a list in lcl_carrier, 
and displays the list.  
*&---------------------------------------------------------------------*

*& Include  ZBC404_HF_LCL_CARRIER                                      *

*&                                                                     *

*&---------------------------------------------------------------------*

*       CLASS lcl_carrier DEFINITION                                   *

*----------------------------------------------------------------------*

CLASS lcl_carrier DEFINITION.
  PUBLIC SECTION.
    TYPES: BEGIN OF flight_list_type,
              connid   TYPE sflight-connid,
              fldate   TYPE sflight-fldate,
              airplane TYPE REF TO lcl_airplane,
              seatsocc TYPE sflight-seatsocc,
              cargo(5) TYPE p DECIMALS 3,
           END OF flight_list_type.
    METHODS: constructor IMPORTING im_name TYPE string,
             get_name RETURNING value(ex_name) TYPE string,
             add_a_new_airplane IMPORTING
                                   im_airplane TYPE REF TO lcl_airplane,
    create_a_new_flight importing
                          im_connid   type sflight-connid
                          im_fldate   type sflight-fldate
                          im_airplane type ref to lcl_airplane
                          im_seatsocc type sflight-seatsocc
                                    optional
                        im_cargo    type p optional,
     display_airplanes.
  PRIVATE SECTION.
    DATA: name              TYPE string,
          list_of_airplanes TYPE TABLE OF REF TO lcl_airplane,
          list_of_flights   TYPE TABLE OF flight_list_type.
ENDCLASS.
*---------------------------------------------------------------------*

*       CLASS lcl_carrier IMPLEMENTATION

*---------------------------------------------------------------------*

CLASS lcl_carrier IMPLEMENTATION.
  METHOD constructor.
    name = im_name.
  ENDMETHOD.
  METHOD get_name.
    ex_name = name.
  ENDMETHOD.
  METHOD create_a_new_flight.
    DATA: wa_list_of_flights TYPE flight_list_type.
    wa_list_of_flights-connid   = im_connid.
    wa_list_of_flights-fldate   = im_fldate.
    wa_list_of_flights-airplane = im_airplane.
    IF im_seatsocc IS INITIAL.
      wa_list_of_flights-cargo = im_cargo.
    ELSE.
      wa_list_of_flights-seatsocc = im_seatsocc.
    ENDIF.
    APPEND wa_list_of_flights TO list_of_flights.
  ENDMETHOD.
  METHOD add_a_new_airplane.
    APPEND im_airplane TO list_of_airplanes.
  ENDMETHOD.
  METHOD display_airplanes.
    DATA: l_airplane TYPE REF TO lcl_airplane.
    LOOP AT list_of_airplanes INTO l_airplane.
      CALL METHOD l_airplane->display_attributes.
    ENDLOOP.
  ENDMETHOD.
ENDCLASS.

REPORT zbc404_hf_main .
*******************************************************************

*  This reprort uses class LCL_AIRPLNAE and subclasses

*  LCL_CARGO_PLANE and LCL_PASSENGER_AIRPLANE and class LCL_CARRIER

*******************************************************************
* Super class for airplanes
INCLUDE zbc404_hf_lcl_airplane.
* Sub classes for airplanes
INCLUDE zbc404_hf_lcl_passenger_plane.
INCLUDE zbc404_hf_lcl_cargo_plane.
* Carrier class
INCLUDE zbc404_hf_lcl_carrier.
DATA:
* Type ref to classes
  o_passenger_airplane  TYPE REF TO lcl_passenger_airplane,
  o_passenger_airplane2 TYPE REF TO lcl_passenger_airplane,
  o_cargo_plane         TYPE REF TO lcl_cargo_plane,
  o_cargo_plane2        TYPE REF TO lcl_cargo_plane,
  o_carrier             TYPE REF TO lcl_carrier.
START-OF-SELECTION.
* Create objects
  CREATE OBJECT o_passenger_airplane
    EXPORTING
      im_name      = 'LH505'
      im_planetype = 'Boing 747'
      im_n_o_seats = 350.
  CREATE OBJECT o_passenger_airplane2
    EXPORTING
      im_name      = 'SK333'
      im_planetype = 'MD80'
      im_n_o_seats = 110.
  CREATE OBJECT o_cargo_plane
    EXPORTING
      im_name      = 'AR13'
      im_planetype = 'DC 3'
      im_cargomax = 35.
  CREATE OBJECT o_cargo_plane2
    EXPORTING
      im_name      = 'AFL124'
      im_planetype = 'Iljutsin 2'
      im_cargomax = 35000.
  CREATE OBJECT o_carrier
    EXPORTING im_name = 'Spritisch Airways'.
* Add passenger and cargo planes to the list of airplanes
  CALL METHOD o_carrier->add_a_new_airplane
     EXPORTING im_airplane = o_passenger_airplane.
  CALL METHOD o_carrier->add_a_new_airplane
     EXPORTING im_airplane = o_passenger_airplane2.
  CALL METHOD o_carrier->add_a_new_airplane
     EXPORTING im_airplane = o_cargo_plane.
  CALL METHOD o_carrier->add_a_new_airplane
     EXPORTING im_airplane = o_cargo_plane2.
* Display list of airplanes

  call method o_carrier->display_airplanes.
Result:
Name: LH505                     Planetype: Boing 747         

No. seats:       350                                         

Name: SK333                     Planetype: MD80              

No. seats:       110                                         

Name: AR13                      Planetype: DC 3              

Cargo max:             35,0000                               

Name: AFL124                    Planetype: Iljutsin 2        

Cargo max:         35.000,0000                               

Events

Below is a simple example of how to implement an event.

REPORT zbc404_hf_events_5.
*---------------------------------------------------------------------*

*       CLASS lcl_dog DEFINITION

*---------------------------------------------------------------------*

CLASS lcl_dog DEFINITION.
  PUBLIC SECTION.
*   Declare events
    EVENTS:
      dog_is_hungry
        EXPORTING value(ex_time_since_last_meal) TYPE i.
    METHODS:
      constructor
          IMPORTING im_name TYPE string,
      set_time_since_last_meal
          IMPORTING im_time TYPE i,
      on_dog_is_hungry FOR EVENT dog_is_hungry OF lcl_dog
          IMPORTING ex_time_since_last_meal.
ENDCLASS.
*---------------------------------------------------------------------*

*       CLASS lcl_dog IMPLEMENTATION

*---------------------------------------------------------------------*
CLASS lcl_dog IMPLEMENTATION.
  METHOD constructor.
    WRITE: / 'You are a dog and Your name is', im_name.
  ENDMETHOD.
  METHOD set_time_since_last_meal.
    IF im_time < 4.
      SKIP 1.
      WRITE: / 'You fool, I am not hungry yet'.
    ELSE.
*    Subsrcribe for event:

*    set handler 

*    FOR !FOR ALL INSTANCES [ACTIVATION ]
      SET HANDLER on_dog_is_hungry FOR ALL INSTANCES ACTIVATION 'X'.
*    Raise event
      RAISE EVENT dog_is_hungry
        EXPORTING ex_time_since_last_meal = im_time.
    ENDIF.
  ENDMETHOD.
  METHOD on_dog_is_hungry.
*   Event method, called when the event dog_is_hungry is raised
    SKIP 1.
    WRITE: /  'You son of a bitch. you have not eaten for more than',
              ex_time_since_last_meal, ' hours'.
    WRITE: / 'Give you something to eat NOW!'.
  ENDMETHOD.
ENDCLASS.
*---------------------------------------------------------------------*

*       R E P O R T

*---------------------------------------------------------------------*
DATA: o_dog1 TYPE REF TO lcl_dog.
START-OF-SELECTION.
  CREATE OBJECT o_dog1 EXPORTING im_name = 'Beefeater'.
  CALL METHOD o_dog1->set_time_since_last_meal
    EXPORTING im_time = 2.
* This method call will raise the event dog_is_hungy

* because time > 3

  CALL METHOD o_dog1->set_time_since_last_meal
    EXPORTING im_time = 5.

Result:

I am a dog and my name is Beefeater

You fool, I am not hungry yet

You son of a bitch. I have not eaten for more than 5 hours
Give me something to eat NOW!

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/190059/viewspace-476529/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/190059/viewspace-476529/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值