Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

Inheritance

Former Member
0 Kudos

Hi Experts,

Give one scenario how inheritance used in the development of object.Please give me

detailed code how we should construct object using inheritance mechanism.

Regards

Pratap.M

1 ACCEPTED SOLUTION

Sougata
Active Contributor
0 Kudos

Hi Pratap,

Inheritence should be used when dealing with related objects of the same category...for e.g. it makes sense for a class of 'Cars' to inherit from a class named 'Vehicle' becuase a car is a type of vehicle. As the word 'inherit' mean<a href="http://dictionary.reference.com/browse/inherit">"to receive as if by succession from predecessors"</a>, so when you make a class inherit its parent class (or its SuperClass) it receives, in this case, all the properties (Methods/Events) and Attributes (Public and Protected data, constants etc.) of its superclass and the class itself is then known as a SubClass...so in short, Class "Vehicle" can be a superclass of the Class "Car" if car inherits vehicle (makes sense to do so).

See example of inheritance below from the book "ABAP Objects" by Horst Keller. I recommend you create this program in your system and run it in debugging mode to understand the concept of inheritance. <b>Note</b> - class "object" is the parent or root Class of all classes, that is to say all classes automatically inherit 'object' class therefore the statement

CLASS vehicle DEFINITION INHERITING FROM object.

does not have much significance in other contexts but its explicitly defined here for demonstration purpose - when you copy the code in your system you could instead say

CLASS vehicle DEFINITION.

and I believe it will work exactly the same.

REPORT s_simple_inheritance.

* Class Declarations

CLASS vehicle DEFINITION INHERITING FROM object.
  PUBLIC SECTION.
    METHODS: accelerate,
             write_status.
  PROTECTED SECTION.
    DATA speed TYPE i.
ENDCLASS.


CLASS plane DEFINITION INHERITING FROM vehicle.
  PUBLIC SECTION.
    METHODS: rise.
  PROTECTED SECTION.
    DATA altitude TYPE i.
ENDCLASS.


CLASS ship DEFINITION INHERITING FROM vehicle.
ENDCLASS.

* Class Implementations

CLASS vehicle IMPLEMENTATION.
  METHOD accelerate.
    speed = speed + 1.
  ENDMETHOD.
  METHOD write_status.
    WRITE: / 'Speed:', speed.
  ENDMETHOD.
ENDCLASS.


CLASS plane IMPLEMENTATION.
  METHOD rise.
    altitude = altitude + 1.
  ENDMETHOD.
ENDCLASS.

* Global Data

DATA: plane_ref TYPE REF TO plane,
      ship_ref TYPE REF TO ship.

* Classical Processing Blocks

START-OF-SELECTION.

  CREATE OBJECT: plane_ref,
                 ship_ref.

  CALL METHOD: plane_ref->accelerate,
               plane_ref->rise,
               plane_ref->write_status,
               ship_ref->accelerate,
               ship_ref->write_status.

Don't forget to reward points and good luck with ABAP Objects.

Cheers,

Sougata.

8 REPLIES 8

Sougata
Active Contributor
0 Kudos

Hi Pratap,

Inheritence should be used when dealing with related objects of the same category...for e.g. it makes sense for a class of 'Cars' to inherit from a class named 'Vehicle' becuase a car is a type of vehicle. As the word 'inherit' mean<a href="http://dictionary.reference.com/browse/inherit">"to receive as if by succession from predecessors"</a>, so when you make a class inherit its parent class (or its SuperClass) it receives, in this case, all the properties (Methods/Events) and Attributes (Public and Protected data, constants etc.) of its superclass and the class itself is then known as a SubClass...so in short, Class "Vehicle" can be a superclass of the Class "Car" if car inherits vehicle (makes sense to do so).

See example of inheritance below from the book "ABAP Objects" by Horst Keller. I recommend you create this program in your system and run it in debugging mode to understand the concept of inheritance. <b>Note</b> - class "object" is the parent or root Class of all classes, that is to say all classes automatically inherit 'object' class therefore the statement

CLASS vehicle DEFINITION INHERITING FROM object.

does not have much significance in other contexts but its explicitly defined here for demonstration purpose - when you copy the code in your system you could instead say

CLASS vehicle DEFINITION.

and I believe it will work exactly the same.

REPORT s_simple_inheritance.

* Class Declarations

CLASS vehicle DEFINITION INHERITING FROM object.
  PUBLIC SECTION.
    METHODS: accelerate,
             write_status.
  PROTECTED SECTION.
    DATA speed TYPE i.
ENDCLASS.


CLASS plane DEFINITION INHERITING FROM vehicle.
  PUBLIC SECTION.
    METHODS: rise.
  PROTECTED SECTION.
    DATA altitude TYPE i.
ENDCLASS.


CLASS ship DEFINITION INHERITING FROM vehicle.
ENDCLASS.

* Class Implementations

CLASS vehicle IMPLEMENTATION.
  METHOD accelerate.
    speed = speed + 1.
  ENDMETHOD.
  METHOD write_status.
    WRITE: / 'Speed:', speed.
  ENDMETHOD.
ENDCLASS.


CLASS plane IMPLEMENTATION.
  METHOD rise.
    altitude = altitude + 1.
  ENDMETHOD.
ENDCLASS.

* Global Data

DATA: plane_ref TYPE REF TO plane,
      ship_ref TYPE REF TO ship.

* Classical Processing Blocks

START-OF-SELECTION.

  CREATE OBJECT: plane_ref,
                 ship_ref.

  CALL METHOD: plane_ref->accelerate,
               plane_ref->rise,
               plane_ref->write_status,
               ship_ref->accelerate,
               ship_ref->write_status.

Don't forget to reward points and good luck with ABAP Objects.

Cheers,

Sougata.

Former Member
0 Kudos

Hi Souguta,

Thanks for u r answer,

I undestand the concept .Please give me one realtime scenario how inheritance is used in any project.

Regards

Pratap.M

Sougata
Active Contributor
0 Kudos

I will but first I want you to show some appreciation for the time that I spent to explain you the concept....and the only way to appreciate in SDN is to reward points.

Cheers,

Sougata.

Former Member
0 Kudos

Assume that you are working on a banking application which has an existing class "Customer". Imagine that the banking application was developed during a period when ATM card was not prevalent.

Now you want to the customers to be provided with ATM cards. You want all the earlier functionality plus now the additional frequirements for ATM cards.

So use the earlier class and add extra functionality by extending the class (inheritance). With this You need to test only the new functionality. So testing and development requirements are reduced substantially.

This is one of the major advantages of inheritance : software reuse.

Former Member
0 Kudos

Hi Pratap,

Go to this link if you want to know theory about any OO concept.

<a href="http://help.sap.com/saphelp_nw2004s/helpdata/en/ce/b518b6513611d194a50000e8353423/frameset.htm">OOABAP</a>

If you want to know how to write the code go to

ABAPDOCU transaction. Here examples are given for each and every concept.

you will get to know the scenarios as well by seeing these examples.

If still you have any problems. Please get back.

Reward points if useful,

Aleem.

Former Member
0 Kudos
"Inheritance

Inheritance allows you to derive a new class from an existing class. You do this using the INHERITING FROM addition in the

"Redefining Methods

All subclasses contain the components of all classes between themselves and the root node in an inheritance tree. The visibility of a component cannot be changed. However, you can use the REDEFINITION addition in the METHODS statement to redefine an inherited public or protected instance method in a subclass and make its function more specialized. When you redefine a method, you cannot change its interface. The method retains the same name and interface, but has a new implementation.

The method declaration and implementation in the superclass is not affected when you redefine the method in a subclass. The implementation of the redefinition in the subclass obscures the original implementation in the superclass.

Any reference that points to an object of the subclass uses the redefined method, even if the reference was defined with reference to the superclass. This particularly applies to the self-reference ME->. If, for example, a superclass method M1 contains a call CALL METHOD M2, and M2 is redefined in a subclass, calling M1 from an instance of the superclass will cause the original method M2 to be called, and calling M1 from an instance of the subclass will cause the redefined method M2 to be called.

Within a redefine method, you can use the pseudoreference SUPER-> to access the obscured method. This enables you to use the existing function of the method in the superclass without having to recode it in the subclass.

"Abstract and Final Methods and Classes

The ABSTRACT and FINALadditions to the METHODS and CLASS statements allow you to define abstract and final methods or classes.

An abstract method is defined in an abstract class and cannot be implemented in that class. Instead, it is implemented in a subclass of the class. Abstract classes cannot be instantiated.

A final method cannot be redefined in a subclass. Final classes cannot have subclasses. They conclude an inheritance tree.

References to Subclasses and Polymorphism

Reference variables defined with reference to a superclass or an interface defined with reference to it can also contain references to any of its subclasses. Since subclasses contain all of the components of all of their superclasses, and given that the interfaces of methods cannot be changed, a reference variable defined with reference to a superclass or an interface implemented by a superclass can contain references to instances of any of its subclasses. In particular, you can define the target variable with reference to the generic class OBJECT.

When you create an object using the CREATE OBJECT statement and a reference variable typed with reference to a subclass, you can use the TYPE addition to create an instance of a subclass, to which the reference in the reference variable will then point.

A static user can use a reference variable to address the components visible to it in the superclass to which the reference variable refers. However, it cannot address any specialization implemented in the subclass. If you use a dynamic method call, you can address all components of the class.

If you redefine an instance method in one or more subclasses, you can use a single reference variable to call different implementations of the method, depending on the position in the inheritance tree at which the referenced object occurs. This concept that different classes can have the same interface and therefore be addressed using reference variables with a single type is called polymorphism.

Namespace for Components

Subclasses contain all of the components of all of their superclasses within the inheritance tree. Of these components, only the public and protected ones are visible. All public and protected components within an inheritance tree belong to the same namespace, and consequently must have unique names. The names of private components, on the other hand, must only be unique within their class.

When you redefine methods, the new implementation of the method obscures the method of the superclass with the same name. However, the new definition replaces the previous method implementation, so the name is still unique. You can use the pseudoreference SUPER-> to access a method definition in a superclass that has been obscured by a redefinition in a subclass.

"Inheritance and Static Attributes

Like all components, static attributes only exist once in each inheritance tree. A subclass can access the public and protected static attributes of all of its superclasses. Conversely, a superclass shares its public and protected static attributes with all of its subclasses. In terms of inheritance, static attributes are not assigned to a single class, but to a part of the inheritance tree. You can change them from outside the class using the class component selector with any class name, or within any class in which they are shared. They are visible in all classes in the inheritance tree.

When you address a static attribute that belongs to part of an inheritance tree, you always address the class in which the attribute is declared, irrespective of the class you specify in the class selector. This is particularly important when you call the static constructors of classes in inheritance. Static constructors are executed the first time you address a class. If you address a static attribute declared in a superclass using the class name of a subclass, only the static constructor of the superclass is executed.

"Inheritance and Constructors

There are special rules governing constructors in inheritance.

"Instance Constructors

Every class has an instance constructor called CONSTRUCTOR. This is an exception to the rule that states that component names within an inheritance tree must be unique. However, the instance constructors of the various classes in an inheritance tree are fully independent of one another. You cannot redefine the instance constructor of a superclass in a subclass, neither can you call one specifically using the statement CALL METHOD CONSTRUCTOR. Consequently, no naming conflicts can occur.

The instance constructor of a class is called by the system when you instantiate the class using CREATE OBJECT. Since a subclass contains all of the visible attributes of its superclasses, which can also be set by instance constructors, the instance constructor of a subclass has to ensure that the instance constructors of all of its superclasses are also called. To do this, the instance constructor of each subclass must contain a CALL METHOD SUPER->CONSTRUCTOR statement. The only exception to this rule are direct subclasses of the root node OBJECT.

In superclasses without an explicitly-defined instance constructor, the implicit instance constructor is called. This automatically ensures that the instance constructor of the immediate superclass is called.

When you call an instance constructor, you must supply values for all of its non-optional interface parameters. There are various ways of doing this:

· Using CREATE OBJECT

If the class that you are instantiating has an instance constructor with an interface, you must pass values to it using EXPORTING.

If the class that you are instantiating has an instance constructor without an interface, you do not pass any parameters.

If the class you are instantiating does not have an explicit instance constructor, you must look in the inheritance tree for the next-highest superclass with an explicit instance constructor. If this has an interface, you must supply values using EXPORTING. Otherwise, you do not have to pass any values.

· Using CALL METHOD SUPER->CONSTRUCTOR

If the direct superclass has an instance constructor with an interface, you must pass values to it using EXPORTING.

If the direct superclass has an instance constructor without an interface, you do not pass any parameters.

If the direct superclass does not have an explicit instance constructor, you must look in the inheritance tree for the next-highest superclass with an explicit instance constructor. If this has an interface, you must supply values using EXPORTING. Otherwise, you do not have to pass any values.

In both CREATE OBJECT and CALL METHOD SUPER->CONSTRUCTOR, you must look at the next-available explicit instance constructor and, if it has an interface, pass values to it. The same applies to exception handling for instance constructors. When you work with inheritance, you need an precise knowledge of the entire inheritance tree. When you instantiate a class at the bottom of the inheritance tree, you may need to pass parameters to the constructor of a class that is much nearer the root node.

The instance constructor of a subclass is divided into two parts by the CALL METHOD SUPER->CONSTRUCTOR statement. In the statements before the call, the constructor behaves like a static method, that is, it cannot access the instance attributes of its class. You cannot address instance attributes until after the call. Use the statements before the call to determine the actual parameters for the interface of the instance constructor of the superclass. You can only use static attributes or local data to do this.

When you instantiate a subclass, the instance constructors are called hierarchically. The first nesting level in which you can address instance attributes is the highest-level superclass. When you return to the constructors of the lower-level classes, you can also successively address their instance attributes.

In a constructor method, the methods of the subclasses of the class are not visible. If an instance constructor calls an instance method of the same class using the implicit self-reference ME->, the method is called as it is implemented in the class of the instance constructor, and not in any redefined form that may occur in the subclass you want to instantiate. This is an exception to the rule that states that when you call instance methods, the system always calls the method as it is implemented in the class to whose instance the reference is pointing.


"Static Constructors

Every class has a static constructor called CLASS_CONSTRUCTOR. As far as the namespace within an inheritance tree, the same applies to static constructors as to instance constructors.

The first time you address a subclass in a program, its static constructor is executed. However, before it can be executed, the static constructors of all of its superclasses must already have been executed. A static constructor may only be called once per program. Therefore, when you first address a subclass, the system looks for the next-highest superclass whose static constructor has not yet been executed. It executes the static constructor of that class, followed by those of all classes between that class and the subclass you addressed.

statement. The new class . The new class is called the subclass of the class from which it is derived. The original class is called the superclass of the new class.

If you do not add any new declarations to the subclass, it contains the same components as the superclass. However, only the public and protected components of the superclass are visible in the subclass. Although the private components of the superclass exist in the subclass, they are not visible. You can declare private components in a subclass that have the same names as private components of the superclass. Each class works with its own private components. Methods that a subclass inherits from a superclass use the private attributes of the superclass, and not any private components of the subclass with the same names.

If the superclass does not have a private visibility section, the subclass is an exact replica of the superclass. However, you can add new components to the subclass. This allows you to turn the subclass into a specialized version of the superclass. If a subclass is itself the superclass of further classes, you introduce a new level of specialization.

A class can have more than one direct subclass, but it may only have one direct superclass. This is called single inheritance. When subclasses inherit from superclasses and the superclass is itself the subclass of another class, all of the classes involved form an inheritance tree, whose degree of specialization increases with each new hierarchical level you add. Conversely, the classes become more generalized until you reach the root node of the inheritance tree. The root node of all inheritance trees in ABAP Objects is the predefined empty class OBJECT. This is the most generalized class possible, since it contains neither attributes nor methods. When you define a new class, you do not have to specify it explicitly as the superclass - the relationship is always implicitly defined. Within an inheritance tree, two adjacent nodes are the direct superclass or direct subclass of one another. Other related nodes are referred to as superclasses and subclasses. The component declarations in a subclass are distributed across all levels of the inheritance tree.

"Example  :
REPORT demo_inheritance.

CLASS counter DEFINITION.
  PUBLIC SECTION.
    METHODS: set IMPORTING value(set_value) TYPE i,
             increment,
             get EXPORTING value(get_value) TYPE i.
   PROTECTED SECTION . 
    DATA count TYPE i.
ENDCLASS.

CLASS counter IMPLEMENTATION.
  METHOD set.
    count = set_value.
  ENDMETHOD.
  METHOD increment.
    ADD 1 TO count.
  ENDMETHOD.
  METHOD get.
    get_value = count.
  ENDMETHOD.
ENDCLASS.

CLASS counter_ten DEFINITION INHERITING FROM counter. 
  PUBLIC SECTION.
    METHODS increment REDEFINITION . 
    DATA count_ten.
ENDCLASS.

CLASS counter_ten IMPLEMENTATION.
  METHOD increment.
    DATA modulo TYPE I.
     CALL METHOD super->increment . 
    write / count.
    modulo = count mod 10.
    IF modulo = 0.
      count_ten = count_ten + 1.
      write count_ten.
    ENDIF.
  ENDMETHOD.
ENDCLASS.

DATA: count TYPE REF TO counter,
      number TYPE i VALUE 5.

START-OF-SELECTION.

   CREATE OBJECT count TYPE counter_ten .

  CALL METHOD count->set EXPORTING set_value = number.

  DO 20 TIMES.
    CALL METHOD count->increment.
  ENDDO.


Reward points if it is usefulll .....

Girish

Former Member
0 Kudos

Hi

In ABAP Objects, the same components (attributes, methods, constants, types, alias names) can be

defined in an interface in largely the same way as in classes. However, interfaces do not have component

visibility sections.

Interfaces are implemented in classes.

The interface name is listed in the definition part of the class. Interfaces can only be implemented ‘publicly’

and are therefore always in the PUBLIC SECTION (this is only valid as of Release 4.6). If you do not do

this, you risk multiple implementations, if a superclass and a subclass both implement the same interface

privately.

The operations defined in the interface are implemented as methods of a class. A check is carried out to

ensure that all the methods defined in the interfaces are actually present in the implementation part of the

class

Declaration of an interface

INTERFACE lif_document.

DATA: author TYPE REF TO lcl_author.

METHODS: print,

display.

ENDINTERFACE.

CLASS lcl_text_document DEFINITION.

PUBLIC SECTION.

INTERFACES lif_document. " Defining within a class.

METHODS: display.

ENDCLASS.

CLASS lcl_img_document DEFINITION.

PUBLIC SECTION.

INTERFACES lif_document. " Defining within a class.

METHODS: display.

ENDCLASS.

*Interfaces are implemented in classes

CLASS lcl_text_document IMPLEMENTATION.

METHOD lif_document~print.

*Your specific code here....

ENDMETHOD.

METHOD lif_document~display.

*Your specific code here....

ENDMETHOD.

METHOD display.

ENDMETHOD.

ENDCLASS.

CLASS lcl_img_document IMPLEMENTATION.

METHOD lif_document~print.

*Your specific code here....

ENDMETHOD.

METHOD lif_document~display.

*Your specific code here....

ENDMETHOD.

METHOD display.

ENDMETHOD.

ENDCLASS.

*Creating an object of that class.

DATA: text_doc TYPE REF TO lcl_text_document.

*Calling methods

CREATE OBJECT text_doc.

CALL METHOD text_doc->lif_document~print.

CALL METHOD text_doc->lif_document~display.

CALL METHOD text_doc->display.

The interface resolution operator enables you to access interface components using an object reference

belonging to the class implementing the interface in exactly the same way as the method definition in the

implementation part of the class.

This allows you to differentiate between components defined in the interface and components of the same

name that are defined in the class itself. This is caused by the shared namespace.

<b>Reward if usefull</b>

Former Member
0 Kudos

Hi Pratap,

Here is the complete example.



CLASS lcl_airplane DEFINITION.
PUBLIC SECTION.
"--------------------------------
CONSTANTS: pos_1 TYPE i VALUE 30.
METHODS: constructor IMPORTING
im_name TYPE string
im_planetype TYPE saplane-planetype,
display_attributes.
CLASS-METHODS: display_n_o_airplanes.
PRIVATE SECTION.
"----------------------------------
METHODS: get_technical_attributes
IMPORTING im_type TYPE saplane-planetype
EXPORTING ex_weight TYPE s_plan_wei
ex_tankcap TYPE s_capacity
DATA: name TYPE string,
planetype TYPE saplane-planetype.
CLASS-DATA: n_o_airplanes TYPE i.
ENDCLASS. "lcl_airplane DEFINITION
*------------------------------------------------------------------*
* CLASS lcl_airplane IMPLEMENTATION *
*------------------------------------------------------------------*
CLASS lcl_airplane IMPLEMENTATION.
METHOD constructor.
name = im_name.
planetype = im_planetype.
n_o_airplanes = n_o_airplanes + 1.
ENDMETHOD. "constructor
METHOD display_attributes.
DATA: weight TYPE saplane-weight,
cap TYPE saplane-tankcap.
WRITE: / icon_ws_plane AS ICON,
/ 'Name of airplane'(001), AT pos_1 name,
/ 'Airplane type: '(002), AT pos_1 planetype.
Continued on next page
get_technical_attributes( EXPORTING im_type = planetype
IMPORTING ex_weight = weight
ex_tankcap = cap ).
WRITE: / 'Weight:'(003), weight,
'Tank capacity:'(004), cap.
ENDMETHOD. "display_attributes
METHOD display_n_o_airplanes.
WRITE: /, / 'Number of airplanes: '(ca1),
AT pos_1 n_o_airplanes LEFT-JUSTIFIED, /.
ENDMETHOD. "display_n_o_airplanes
METHOD get_technical_attributes.
SELECT SINGLE weight tankcap FROM saplane
INTO (ex_weight, ex_tankcap)
WHERE planetype = im_type.
IF sy-subrc <> 0.
ex_weight = 100000.
ex_tankcap = 10000.
ENDIF.
ENDMETHOD. "get_technical_attributes
ENDCLASS. "lcl_airplane IMPLEMENTATION
*---------------------------------------------------------------------*
* CLASS lcl_cargo_plane DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_cargo_plane DEFINITION INHERITING FROM lcl_airplane.
PUBLIC SECTION.
"----------------------
METHODS: constructor IMPORTING im_name TYPE string
im_planetype TYPE saplane-planetype
im_cargo TYPE scplane-cargomax.
METHODS: display_attributes REDEFINITION.
METHODS: get_cargo RETURNING VALUE(re_cargo) TYPE scplane-cargomax.
PRIVATE SECTION.
"----------------------
DATA: max_cargo TYPE scplane-cargomax.
ENDCLASS. "lcl_cargo_plane DEFINITION
*---------------------------------------------------------------------*
* CLASS lcl_cargo_plane IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_cargo_plane IMPLEMENTATION.
METHOD constructor.
CALL METHOD super->constructor( im_name = im_name
im_planetype = im_planetype ).
max_cargo = im_cargo.
ENDMETHOD. "constructor
METHOD display_attributes.
super->display_attributes( ).
WRITE: / 'Max Cargo = ', max_cargo.
ULINE.
ENDMETHOD. "display_attributes
METHOD get_cargo.
re_cargo = max_cargo.
ENDMETHOD. "get_cargo
ENDCLASS. "lcl_cargo_plane IMPLEMENTATION
*---------------------------------------------------------------------*
* CLASS lcl_passenger_plane DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_passenger_plane DEFINITION INHERITING FROM lcl_airplane..
PUBLIC SECTION.
METHODS: constructor IMPORTING im_name TYPE string
im_planetype TYPE saplane-planetype
im_seats TYPE sflight-seatsmax.
METHODS: display_attributes REDEFINITION.
PRIVATE SECTION.
DATA: max_seats TYPE sflight-seatsmax.
ENDCLASS. "lcl_passenger_plane DEFINITION
*---------------------------------------------------------------------*
* CLASS lcl_passenger_plane IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_passenger_plane IMPLEMENTATION.
METHOD constructor.
CALL METHOD super->constructor( EXPORTING im_name = im_name
im_planetype = im_planetype ).
max_seats = im_seats.
ENDMETHOD. "constructor
METHOD display_attributes.
super->display_attributes( ).
WRITE: / 'Max Seats = ', max_seats.
ULINE.
ENDMETHOD. "display_attributes
ENDCLASS. "lcl_passenger_plane IMPLEMENTATION

Reward points if useful,

Aleem.