- Define, implement and use simple class
- Use constructor to create an object with parameters
- Subclassing
- Polymorphism
- Events
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: / 'I am a dog and my 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 <Event handler method> * FOR <ref_sender>!FOR ALL INSTANCES [ACTIVATION <var>] 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 LLLL. I have not eaten for more than', ex_time_since_last_meal, ' hours'. WRITE: / 'Give me 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 LLLL. I have not eaten for more than 5 hours Give me something to eat NOW!
Related Items:
|