ABAP OBJECT-ORIENTED PROGRAMMING-EXAMPLE01

原创 2005年03月01日 09:47:00
1. Simple class

This example shows how to create a simple employee class. The constructor method is used to initialize number and name of thje employee when the object is created. A display_employee method can be called to show the attributes of the employee, and CLASS-METHOD dosplay_no_of_employees can be called to show the total number of employees (Number of instances of the employee class).

 

REPORT zbc404_hf_events_1.
*********************************************************************

* L C L _ E M P L O Y E E

*********************************************************************
*---- LCL Employee - Definition
CLASS lcl_employee DEFINITION.
  PUBLIC SECTION.
*--------------------------------------------------------------------

* The public section is accesible from outside   

*--------------------------------------------------------------------
    TYPES:
      BEGIN OF t_employee,
        no  TYPE i,
        name TYPE string,
     END OF t_employee.
    METHODS:
      constructor
        IMPORTING im_employee_no TYPE i
                  im_employee_name TYPE string,
      display_employee.
*   Class methods are global for all instances       
    CLASS-METHODS: display_no_of_employees.
  PROTECTED SECTION.
*--------------------------------------------------------------------

* The protecetd section is accesible from the class and its subclasses  

*--------------------------------------------------------------------
*   Class data are global for all instances       
    CLASS-DATA: g_no_of_employees TYPE i.
  PRIVATE SECTION.
*--------------------------------------------------------------------

* The private section is only accesible from within the classs  

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

    DATA: g_employee TYPE t_employee.
ENDCLASS.
*--- LCL Employee - Implementation
CLASS lcl_employee IMPLEMENTATION.
  METHOD constructor.
    g_employee-no = im_employee_no.
    g_employee-name = im_employee_name.
    g_no_of_employees = g_no_of_employees + 1.
  ENDMETHOD.
  METHOD display_employee.
    WRITE:/ 'Employee', g_employee-no, g_employee-name.
  ENDMETHOD.
  METHOD display_no_of_employees.
    WRITE: / 'Number of employees is:', g_no_of_employees.
  ENDMETHOD.
ENDCLASS.
************************************************************************

* R E P O R T

*********************************************************************
DATA: g_employee1 TYPE REF TO lcl_employee,
      g_employee2 TYPE REF TO lcl_employee.
START-OF-SELECTION.
  CREATE OBJECT g_employee1
    EXPORTING im_employee_no = 1
              im_employee_name = 'John Jones'.
  CREATE OBJECT g_employee2
    EXPORTING im_employee_no = 2
              im_employee_name = 'Sally Summer'.
  CALL METHOD g_employee1->display_employee.
  CALL METHOD g_employee2->display_employee.
  CALL METHOD g_employee2->display_no_of_employees.

2. Inheritance and polymorphism

This example uses a superclass lcl_company_employees and two subclasses lcl_bluecollar_employee and lcl_whitecollar_employee to add employees to a list and then display a list of employees and there wages. The wages are calcukated in the method add_employee, but as the wages are calculated differently for blue collar employees and white collar emplyees, the superclass method add_employee is redeifined in the subclasses.

Principles:

Create super class LCL_CompanyEmployees.

The class has the methods:

  • Constructor
  • Add_Employee - Adds a new employee to the list of employees
  • Display_Employee_List - Displays all employees and there wage
  • Display_no_of_employees - Displays total number of employees

Note the use of CLASS-DATA to keep the list of employees and number of employees the same from instance to instance.

Create subclasses lcl_bluecollar_employee and lcl_whitecollar_employee. The calsses are identical, except for the redifinition of the add_employee method, where the caclculation of wage is different.

Methodes:

  • Constructor. The constructor is used to initialize the attributes of the employee. Note that the constructor in the supclasss has to be called from within the constructor of the subclass.
  • Add_Employee. This is a redinition of the same method in the superclass. In the redefined class the wage is calcuated, and the superclass method is called to add the employees to the emploee list.:

The program

 

REPORT zbc404_hf_events_2 .
*******************************************************

* Super class LCL_CompanyEmployees

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

CLASS lcl_company_employees DEFINITION.
  PUBLIC SECTION.
    TYPES:
      BEGIN OF t_employee,
        no  TYPE i,
        name TYPE string,
        wage TYPE i,
     END OF t_employee.
    METHODS:
      constructor,
      add_employee
        IMPORTING im_no   TYPE i
                  im_name TYPE string
                  im_wage TYPE i,
      display_employee_list,
      display_no_of_employees.

 
  PRIVATE SECTION.
    CLASS-DATA: i_employee_list TYPE TABLE OF t_employee,
                no_of_employees TYPE i.
ENDCLASS.
*-- CLASS LCL_CompanyEmployees IMPLEMENTATION
CLASS lcl_company_employees IMPLEMENTATION.
  METHOD constructor.
    no_of_employees = no_of_employees + 1.
  ENDMETHOD.
  METHOD add_employee.
*   Adds a new employee to the list of employees
    DATA: l_employee TYPE t_employee.
    l_employee-no = im_no.
    l_employee-name = im_name.
    l_employee-wage = im_wage.
    APPEND l_employee TO i_employee_list.
  ENDMETHOD.
  METHOD display_employee_list.
*   Displays all employees and there wage
    DATA: l_employee TYPE t_employee.
    WRITE: / 'List of Employees'.
    LOOP AT i_employee_list INTO l_employee.
      WRITE: / l_employee-no, l_employee-name, l_employee-wage.
    ENDLOOP.
  ENDMETHOD.
  METHOD display_no_of_employees.
*   Displays total number of employees
    SKIP 3.
    WRITE: / 'Total number of employees:', no_of_employees.
  ENDMETHOD.
ENDCLASS.

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

* Sub class LCL_BlueCollar_Employee

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

CLASS lcl_bluecollar_employee DEFINITION

          INHERITING FROM lcl_company_employees.
  PUBLIC SECTION.
    METHODS:
        constructor
          IMPORTING im_no             TYPE i
                    im_name           TYPE string
                    im_hours          TYPE i
                    im_hourly_payment TYPE i,
         add_employee REDEFINITION.
  PRIVATE SECTION.
    DATA:no             TYPE i,
         name           TYPE string,
         hours          TYPE i,
         hourly_payment TYPE i.

 
ENDCLASS.
*---- CLASS LCL_BlueCollar_Employee IMPLEMENTATION
CLASS lcl_bluecollar_employee IMPLEMENTATION.
  METHOD constructor.
*   The superclass constructor method must be called from the subclass

*   constructor method
    CALL METHOD super->constructor.
    no = im_no.
    name = im_name.
    hours = im_hours.
    hourly_payment = im_hourly_payment.
  ENDMETHOD.
  METHOD add_employee.
*   Calculate wage an call the superclass method add_employee to add

*   the employee to the employee list
    DATA: l_wage TYPE i.
    l_wage = hours * hourly_payment.
    CALL METHOD super->add_employee
      EXPORTING im_no = no
                im_name = name
                im_wage = l_wage.
  ENDMETHOD.
ENDCLASS.
*******************************************************

* Sub class LCL_WhiteCollar_Employee

*******************************************************
CLASS lcl_whitecollar_employee DEFINITION

    INHERITING FROM lcl_company_employees.
  PUBLIC SECTION.
    METHODS:
        constructor
          IMPORTING im_no                 TYPE i
                    im_name               TYPE string
                    im_monthly_salary     TYPE i
                    im_monthly_deductions TYPE i,
         add_employee REDEFINITION.
  PRIVATE SECTION.
    DATA:
      no                    TYPE i,
      name                  TYPE string,
      monthly_salary        TYPE i,
      monthly_deductions    TYPE i.
ENDCLASS.
*---- CLASS LCL_WhiteCollar_Employee IMPLEMENTATION
CLASS lcl_whitecollar_employee IMPLEMENTATION.
  METHOD constructor.
*   The superclass constructor method must be called from the subclass

*   constructor method

    CALL METHOD super->constructor.
    no = im_no.
    name = im_name.
    monthly_salary = im_monthly_salary.
    monthly_deductions = im_monthly_deductions.
  ENDMETHOD.
  METHOD add_employee.
*   Calculate wage an call the superclass method add_employee to add

*   the employee to the employee list
    DATA: l_wage TYPE i.
    l_wage = monthly_salary - monthly_deductions.
    CALL METHOD super->add_employee
      EXPORTING im_no = no
                im_name = name
                im_wage = l_wage.
  ENDMETHOD.
ENDCLASS.
*******************************************************

* R E P O R T

*******************************************************
DATA:
* Object references
  o_bluecollar_employee1  TYPE REF TO lcl_bluecollar_employee,
  o_whitecollar_employee1 TYPE REF TO lcl_whitecollar_employee.
START-OF-SELECTION.
* Create bluecollar employee obeject
  CREATE OBJECT o_bluecollar_employee1
      EXPORTING im_no  = 1
                im_name  = 'Gylle Karen'
                im_hours = 38
                im_hourly_payment = 75.
* Add bluecollar employee to employee list
  CALL METHOD o_bluecollar_employee1->add_employee
      EXPORTING im_no  = 1
                im_name  = 'Gylle Karen'
                im_wage = 0.
* Create whitecollar employee obeject
  CREATE OBJECT o_whitecollar_employee1
      EXPORTING im_no  = 2
                im_name  = 'John Dickens'
                im_monthly_salary = 10000
                im_monthly_deductions = 2500.
* Add bluecollar employee to employee list
  CALL METHOD o_whitecollar_employee1->add_employee
      EXPORTING im_no  = 1
                im_name  = 'Karen Johnson'
                im_wage = 0.
* Display employee list and number of employees. Note that the result

* will be the same when called from o_whitecollar_employee1 or

* o_bluecolarcollar_employee1, because the methods are defined

* as static (CLASS-METHODS)
  CALL METHOD o_whitecollar_employee1->display_employee_list.
  CALL METHOD o_whitecollar_employee1->display_no_of_employees.

The resulting report

List of Employees
1 Karen Johnson 2.850
2 John Dickens 7.500


Total number of employees: 2

3. Interfaces

This example is similiar to th eprevious example, however an interface is implemented with the method add_employee. Note that the interface is only implemented in the superclass ( The INTERFACE stament), but also used in the subclasses.

The interface in the example only contains a method, but an iterface can also contain attrbutes, constants, types and alias names.

The output from example 3 is similiar to the output in example 2.

All changes in the program compared to example 2 are marked with red.

REPORT zbc404_hf_events_3 .
*---------------------------------------------------------------------*

*       INTERFACE lif_employee

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

INTERFACE lif_employee.

  METHODS:

    add_employee

       IMPORTING im_no   TYPE i

                  im_name TYPE string

                  im_wage TYPE i.

ENDINTERFACE.

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

* Super class LCL_CompanyEmployees

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

CLASS lcl_company_employees DEFINITION.
  PUBLIC SECTION.
    INTERFACES lif_employee.
    TYPES:
      BEGIN OF t_employee,
        no  TYPE i,
        name TYPE string,
        wage TYPE i,
     END OF t_employee.
    METHODS:
      constructor,
*      add_employee      "Removed
        IMPORTING im_no   TYPE i
                  im_name TYPE string
                  im_wage TYPE i,
      display_employee_list,
      display_no_of_employees.

 
  PRIVATE SECTION.
    CLASS-DATA: i_employee_list TYPE TABLE OF t_employee,
                no_of_employees TYPE i.
ENDCLASS.
*-- CLASS LCL_CompanyEmployees IMPLEMENTATION
CLASS lcl_company_employees IMPLEMENTATION.
  METHOD constructor.
    no_of_employees = no_of_employees + 1.
  ENDMETHOD.
  METHOD lif_employee~add_employee.
*   Adds a new employee to the list of employees
    DATA: l_employee TYPE t_employee.
    l_employee-no = im_no.
    l_employee-name = im_name.
    l_employee-wage = im_wage.
    APPEND l_employee TO i_employee_list.
  ENDMETHOD.
  METHOD display_employee_list.
*   Displays all employees and there wage
    DATA: l_employee TYPE t_employee.
    WRITE: / 'List of Employees'.
    LOOP AT i_employee_list INTO l_employee.
      WRITE: / l_employee-no, l_employee-name, l_employee-wage.
    ENDLOOP.
  ENDMETHOD.
  METHOD display_no_of_employees.
*   Displays total number of employees
    SKIP 3.
    WRITE: / 'Total number of employees:', no_of_employees.
  ENDMETHOD.
ENDCLASS.

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

* Sub class LCL_BlueCollar_Employee

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

CLASS lcl_bluecollar_employee DEFINITION

          INHERITING FROM lcl_company_employees.
  PUBLIC SECTION.
    METHODS:
        constructor
          IMPORTING im_no             TYPE i
                    im_name           TYPE string
                    im_hours          TYPE i
                    im_hourly_payment TYPE i,
         lif_employee~add_employee REDEFINITION..
  PRIVATE SECTION.
    DATA:no             TYPE i,
         name           TYPE string,
         hours          TYPE i,
         hourly_payment TYPE i.

 
ENDCLASS.
*---- CLASS LCL_BlueCollar_Employee IMPLEMENTATION
CLASS lcl_bluecollar_employee IMPLEMENTATION.
  METHOD constructor.
*   The superclass constructor method must be called from the subclass

*   constructor method
    CALL METHOD super->constructor.
    no = im_no.
    name = im_name.
    hours = im_hours.
    hourly_payment = im_hourly_payment.
  ENDMETHOD.
  METHOD lif_employee~add_employee.
*   Calculate wage an call the superclass method add_employee to add

*   the employee to the employee list
    DATA: l_wage TYPE i.
    l_wage = hours * hourly_payment.
    CALL METHOD super->lif_employee~add_employee
      EXPORTING im_no = no
                im_name = name
                im_wage = l_wage.
  ENDMETHOD.
ENDCLASS.
*******************************************************

* Sub class LCL_WhiteCollar_Employee

*******************************************************
CLASS lcl_whitecollar_employee DEFINITION

    INHERITING FROM lcl_company_employees.
  PUBLIC SECTION.
    METHODS:
        constructor
          IMPORTING im_no                 TYPE i
                    im_name               TYPE string
                    im_monthly_salary     TYPE i
                    im_monthly_deductions TYPE i,
         lif_employee~add_employee REDEFINITION.
  PRIVATE SECTION.
    DATA:
      no                    TYPE i,
      name                  TYPE string,
      monthly_salary        TYPE i,
      monthly_deductions    TYPE i.
ENDCLASS.
*---- CLASS LCL_WhiteCollar_Employee IMPLEMENTATION
CLASS lcl_whitecollar_employee IMPLEMENTATION.
  METHOD constructor.
*   The superclass constructor method must be called from the subclass

*   constructor method

    CALL METHOD super->constructor.
    no = im_no.
    name = im_name.
    monthly_salary = im_monthly_salary.
    monthly_deductions = im_monthly_deductions.
  ENDMETHOD.
  METHOD lif_employee~add_employee.
*   Calculate wage an call the superclass method add_employee to add

*   the employee to the employee list
    DATA: l_wage TYPE i.
    l_wage = monthly_salary - monthly_deductions.
    CALL METHOD super->lif_employee~add_employee
      EXPORTING im_no = no
                im_name = name
                im_wage = l_wage.
  ENDMETHOD.
ENDCLASS.
*******************************************************

* R E P O R T

*******************************************************
DATA:
* Object references
  o_bluecollar_employee1  TYPE REF TO lcl_bluecollar_employee,
  o_whitecollar_employee1 TYPE REF TO lcl_whitecollar_employee.
START-OF-SELECTION.
* Create bluecollar employee obeject
  CREATE OBJECT o_bluecollar_employee1
      EXPORTING im_no  = 1
                im_name  = 'Gylle Karen'
                im_hours = 38
                im_hourly_payment = 75.
* Add bluecollar employee to employee list
  CALL METHOD o_bluecollar_employee1->lif_employee~add_employee
      EXPORTING im_no  = 1
                im_name  = 'Karen Johnson'
                im_wage = 0.
* Create whitecollar employee obeject
  CREATE OBJECT o_whitecollar_employee1
      EXPORTING im_no  = 2
                im_name  = 'John Dickens'
                im_monthly_salary = 10000
                im_monthly_deductions = 2500.
* Add bluecollar employee to employee list
  CALL METHOD o_whitecollar_employee1->lif_employee~add_employee
      EXPORTING im_no  = 1
                im_name  = 'Gylle Karen'
                im_wage = 0.
* Display employee list and number of employees. Note that the result

* will be the same when called from o_whitecollar_employee1 or

* o_bluecolarcollar_employee1, because the methods are defined

* as static (CLASS-METHODS)
  CALL METHOD o_whitecollar_employee1->display_employee_list.
  CALL METHOD o_whitecollar_employee1->display_no_of_employees.

 

4. Events

This is the same example as example 4. All changes are marked with red. There have been no canges to the subclasses, only to the superclass and the report, sp the code for th esubclasses is not shown.

For a simple example refer to Events in Examples.

REPORT zbc404_hf_events_4 .
*---------------------------------------------------------------------*

*       INTERFACE lif_employee

*---------------------------------------------------------------------*
INTERFACE lif_employee.
  METHODS:
    add_employee
       IMPORTING im_no   TYPE i
                  im_name TYPE string
                  im_wage TYPE i.
ENDINTERFACE.
*******************************************************

* Super class LCL_CompanyEmployees

*******************************************************
CLASS lcl_company_employees DEFINITION.
  PUBLIC SECTION.
    TYPES:
    BEGIN OF t_employee,
      no  TYPE i,
      name TYPE string,
      wage TYPE i,
   END OF t_employee.
*   Declare event. Note that declaration could also be placed in the

*   interface
    EVENTS: employee_added_to_list

        EXPORTING value(ex_employee_name) TYPE string.

*  CLASS-EVENTS: Events can also be defined as class-events
    INTERFACES lif_employee.
    METHODS:
      constructor,
      display_employee_list,
      display_no_of_employees,
*     Declare event method

      on_employee_added_to_list FOR EVENT employee_added_to_list OF lcl_company_employees

         IMPORTING ex_employee_name sender.
  PRIVATE SECTION.
    CLASS-DATA:
      i_employee_list TYPE TABLE OF t_employee,
      no_of_employees TYPE i.
ENDCLASS.
*-- CLASS LCL_CompanyEmployees IMPLEMENTATION
CLASS lcl_company_employees IMPLEMENTATION.
  METHOD constructor.
    no_of_employees = no_of_employees + 1.
  ENDMETHOD.
  METHOD lif_employee~add_employee.
*   Adds a new employee to the list of employees

    DATA: l_employee TYPE t_employee.
    l_employee-no = im_no.
    l_employee-name = im_name.
    l_employee-wage = im_wage.
    APPEND l_employee TO i_employee_list.
*   Raise event employee_added_to_list
    RAISE EVENT employee_added_to_list

       EXPORTING ex_employee_name =  l_employee-name.
  ENDMETHOD.
  METHOD display_employee_list.
*   Displays all employees and there wage
    DATA: l_employee TYPE t_employee.
    WRITE: / 'List of Employees'.
    LOOP AT i_employee_list INTO l_employee.
      WRITE: / l_employee-no, l_employee-name, l_employee-wage.
    ENDLOOP.
  ENDMETHOD.
  METHOD display_no_of_employees.
*   Displays total number of employees
    SKIP 3.
    WRITE: / 'Total number of employees:', no_of_employees.
  ENDMETHOD.
  METHOD on_employee_added_to_list.

*   Event method

    WRITE: / 'Employee added to list', ex_employee_name.

  ENDMETHOD.
ENDCLASS.
*******************************************************

* Sub class LCL_BlueCollar_Employee

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

CLASS lcl_bluecollar_employee DEFINITION

          INHERITING FROM lcl_company_employees.

 See code in example 3...
ENDCLASS.
CLASS lcl_bluecollar_employee IMPLEMENTATION.
 See code in example 3...
ENDCLASS.
*******************************************************

* Sub class LCL_WhiteCollar_Employee

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

CLASS lcl_whitecollar_employee DEFINITION
 See code in example 3...
ENDCLASS.
CLASS lcl_whitecollar_employee IMPLEMENTATION.
 See code in example 3...
ENDCLASS.
*******************************************************

* R E P O R T

*******************************************************
DATA:
* Object references
  o_bluecollar_employee1  TYPE REF TO lcl_bluecollar_employee,
  o_whitecollar_employee1 TYPE REF TO lcl_whitecollar_employee.
START-OF-SELECTION.
* Create bluecollar employee obeject
  CREATE OBJECT o_bluecollar_employee1
      EXPORTING im_no  = 1
                im_name  = 'Karen Johnson'
                im_hours = 38
                im_hourly_payment = 75.
* Register event for o_bluecollar_employee1
  SET HANDLER o_bluecollar_employee1->on_employee_added_to_list

     FOR o_bluecollar_employee1.

* Add bluecollar employee to employee list
  CALL METHOD o_bluecollar_employee1->lif_employee~add_employee
      EXPORTING im_no  = 1
                im_name  = 'Gylle Karen'
                im_wage = 0.
* Create whitecollar employee obeject
  CREATE OBJECT o_whitecollar_employee1
      EXPORTING im_no  = 2
                im_name  = 'John Dickens'
                im_monthly_salary = 10000
                im_monthly_deductions = 2500.
* Register event for o_whitecollar_employee1
  SET HANDLER o_whitecollar_employee1->on_employee_added_to_list

     FOR o_whitecollar_employee1.´


 
* Add bluecollar employee to employee list
  CALL METHOD o_whitecollar_employee1->lif_employee~add_employee
      EXPORTING im_no  = 1
                im_name  = 'Gylle Karen'
                im_wage = 0.
* Display employee list and number of employees. Note that the result

* will be the same when called from o_whitecollar_employee1 or

* o_bluecolarcollar_employee1, because the methods are defined

* as static (CLASS-METHODS)

  CALL METHOD o_whitecollar_employee1->display_employee_list.
  CALL METHOD o_whitecollar_employee1->display_no_of_employees.

Result:


Employee added to list Karen Johnson
Employee added to list John Dickens
List of Employees
1 Karen Johnson 2.850
2 John Dickens 7.500


Total number of employees: 2

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

[Object-Oriented Programming] Midterm Project

the requirement:  The Personal Diary is a CLI (Command Line Interface) software, consists of thre...

Object Oriented Programming in C

Embedded software development is slowly moving towards object orientedanalysis, designand programmin...

Chapter 1 Object Oriented Programming (OOP)

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...

面向对象编程(OOP)Object Oriented Programming

面向对象编程

OOPC:Object-Oriented Programming in C

转载自:http://www.cnblogs.com/stli/archive/2010/10/16/1853190.html  OOPC是指OOP(Object-Oriented Progra...

[Tech Note] Things you better know about object-oriented programming

Introduction This article introduces several valuable zhishizhishi

《Object-Oriented Programming With ANSI-C》之第二章(动态链接和泛函数)

第二章 动态链接和泛函数 2.1 构造器和析构器        让我们来实现一个简单的字符串数据类型,这个数据类型将在接下来的集合中用到。对于新的字符串,我们分配一个动态缓存来保存字文本。当...

Chapter 15 Object-Oriented Programming

Object-oriented programming is based on three fundamental concepts:data abstraction, inheritance, an...

《Object-Oriented Programming With ANSI-C》之序言

ANSI-C面向对象程序设计        前言   没有万能的编程技术 没有只产生正确的结果的编程语言 不是每个项目的编程都是从零开始的     面向对象程序设...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)