ABAP Objects: Classes & Objects

Attribute additions: READ-ONLY (public read, private write), VALUE.

20.1 Class definition and implementation

CLASS lcl_account DEFINITION.
  PUBLIC SECTION.
    TYPES ty_amount TYPE p LENGTH 15 DECIMALS 2.

    CLASS-DATA gv_count TYPE i READ-ONLY.            " static attribute
    CONSTANTS gc_bank TYPE string VALUE `ABAP Bank`.

    METHODS constructor IMPORTING iv_owner TYPE string iv_initial TYPE ty_amount DEFAULT 0.
    METHODS deposit     IMPORTING iv_amount TYPE ty_amount.
    METHODS withdraw    IMPORTING iv_amount TYPE ty_amount
                        RAISING   zcx_insufficient_funds.
    METHODS get_balance RETURNING VALUE(rv_balance) TYPE ty_amount.
    CLASS-METHODS class_constructor.

  PROTECTED SECTION.
    DATA mv_balance TYPE ty_amount.

  PRIVATE SECTION.
    DATA mv_owner TYPE string.
ENDCLASS.

CLASS lcl_account IMPLEMENTATION.
  METHOD class_constructor.
    gv_count = 0.                                    " runs once per internal session
  ENDMETHOD.

  METHOD constructor.
    mv_owner   = iv_owner.
    mv_balance = iv_initial.
    gv_count  += 1.
  ENDMETHOD.

  METHOD deposit.
    mv_balance += iv_amount.
  ENDMETHOD.

  METHOD withdraw.
    IF iv_amount > mv_balance.
      RAISE EXCEPTION NEW zcx_insufficient_funds( ).
    ENDIF.
    mv_balance -= iv_amount.
  EN
…

20.2 Creating and using objects

DATA lo_acc TYPE REF TO lcl_account.
CREATE OBJECT lo_acc EXPORTING iv_owner = `Rachel`.     " classic
DATA(lo_acc2) = NEW lcl_account( iv_owner = `Mohan` iv_initial = 500 ).  " modern

lo_acc2->deposit( 100 ).                               " single parameter: no name needed
lo_acc2->deposit( iv_amount = 100 ).
DATA(lv_bal) = lo_acc2->get_balance( ).                " functional call
WRITE: / lcl_account=>gv_count, lcl_account=>gc_bank.  " static access with =>

CALL METHOD lo_acc2->deposit EXPORTING iv_amount = 50. " obsolete long form

20.3 Visibility and components

The class, its subclasses, and friends The class itself and friends constructor (per object)

class_constructor (once, before first access) Attribute additions: READ-ONLY (public read, private write), VALUE. Method parameters: IMPORTING, EXPORTING, CHANGING, RETURNING VALUE() (functional methods), RAISING; additions OPTIONAL, DEFAULT, PREFERRED PARAMETER, pass by VALUE() or REFERENCE().

20.4 Global classes (SE24 / ADT)

Global classes (ZCL_…) live in class pools. In ADT the whole class is one source with tabs for *Global Class*, *Class-relevant Local Types*, *Local Types*, and *Test Classes*:

CLASS zcl_order_service DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC.

  PUBLIC SECTION.
    METHODS get_open_orders
      IMPORTING iv_customer      TYPE kunnr
      RETURNING VALUE(rt_orders) TYPE ztt_orders.
ENDCLASS.

CLASS zcl_order_service IMPLEMENTATION.
  METHOD get_open_orders.
    SELECT * FROM zorders
      WHERE customer = @iv_customer AND status = 'O'
      INTO CORRESPONDING FIELDS OF TABLE @rt_orders.
  ENDMETHOD.
ENDCLASS.

20.5 Instantiation control

CREATE PUBLIC (anyone), CREATE PROTECTED (class and subclasses), CREATE PRIVATE (only the class — used for singletons and factories, §22). Garbage collection frees objects with no remaining references; CLEAR lo_ref drops a reference.

20.6 Method chaining and functional calls

DATA(lv_text) = NEW zcl_formatter( )->set_prefix( `>> ` )->format( lv_raw ).
IF lo_validator->is_valid( ls_order ).            " predicative method call
ENDIF.