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