advanced abap objects programming

53
Advanced ABAP Objects Programming Horst Keller / Stefan Bresch Business Programming Languages, SAP AG

Upload: bran

Post on 01-Feb-2016

144 views

Category:

Documents


25 download

DESCRIPTION

Advanced ABAP Objects Programming. Horst Keller / Stefan Bresch Business Programming Languages, S AP AG. Overview. Interfaces and Inheritance Visibility and Access Method Call Object Services. Interfaces and Inheritance. Abstract and Final Classes and Methods. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Advanced  ABAP Objects Programming

Advanced ABAP Objects Programming

Horst Keller / Stefan Bresch Business Programming Languages, SAP AG

Page 2: Advanced  ABAP Objects Programming

Overview

Interfaces and Inheritance

Visibility and Access

Method Call

Object Services

Page 3: Advanced  ABAP Objects Programming

Interfaces and Inheritance

Abstract and Final Classes and Methods

Composing Interfaces

Polymorphism

Polymorphic Event Handling

Page 4: Advanced  ABAP Objects Programming

Interfaces and Inheritance – Principles

ABAP Objects supports single inheritance

Classes can implement several interfaces

CLASS c1 DEFINITION. ...CLASS c2 DEFINITION INHERITING FROM c1. ...CLASS c3 DEFINITION INHERITING FROM c1. ...

INTERFACE i1. ...INTERFACE i2. ...CLASS c1 DEFINITION.

PUBLIC SECTION. INTERFACES: i1, i2. ...

Page 5: Advanced  ABAP Objects Programming

Abstract and Final Classes and Methods

Abstract Classes and Methods

CLASS c1 DEFINTION ABSTRACT. METHODS: m1, m2 ABSTRACT.ENDCLASS.

CLASS c1 IMPLEMENTATION. METHODS m1. ENDMETHOD.ENDCLASS.

Abstract classes can‘t be instantiated

Abstract methods can only be implemented in a subclass, using REDEFINITION.

A class containing an abstract method must itself be abstract.

Compared to interfaces, abstract classes can be partly implemented but are restricted by single inheritance.

Page 6: Advanced  ABAP Objects Programming

Abstract and Final Classes and Methods

Final Classes and Methods

CLASS c1 DEFINTION FINAL. METHODS: m1, m2.ENDCLASS.

CLASS c2 DEFINITION. METHODS: m1, m2 FINAL.ENDCLASS.

Final classes can‘t have subclasses.

Final methods can‘t be redefined.

All methods of a final class are implicitly final.

Final classes are endnodes of the inheritance tree.

Page 7: Advanced  ABAP Objects Programming

Interfaces – Implementation

New additions for implementation in classes:

CLASS class DEFINITION.

PUBLIC SECTION. INTERFACES intf. ...

You can make interface methods abstract or final.

You can assign start values to interface attributes.

6.10

CLASS class DEFINITION.

PUBLIC SECTION. INTERFACES intf [ABSTRACT METHODS meth ...] [FINAL METHODS meth ...] [ALL METHODS ABSTRACT|FINAL] [DATA VALUES attr = value ...]. ...

Page 8: Advanced  ABAP Objects Programming

Composing Interfaces

INTERFACE i1. ... ... ...ENDINTERFACE.

i1: Compound Interface

i2, i3, ... : Component Interfaces

Composing Interfaces

INTERFACE i1. ... INTERFACES i2, i3, ... ...ENDINTERFACE.

Page 9: Advanced  ABAP Objects Programming

Composing Interfaces – Naming

INTERFACE i2. INTERFACES i1.ENDINTERFACE.

INTERFACE i3. INTERFACES i1, i2.ENDINTERFACE.

i3 contains i1 exactly once

The name of i1 in i3 is i3~i1

No nesting of names (i3~i2~i1) allowed

Page 10: Advanced  ABAP Objects Programming

Composing Interfaces – Diamond Inheritance

INTERFACE i1. METHODS meth.ENDINTERFACE.

INTERFACE i2. INTERFACES i1. METHODS meth.ENDINTERFACE.

INTERFACE i3. INTERFACES i1. METHODS meth.ENDINTERFACE.

INTERFACE i4. INTERFACES i2, i3.ENDINTERFACE. Problem?

Page 11: Advanced  ABAP Objects Programming

Composing Interfaces – Implementation

CLASS c1 DEFINITION. PUBLIC SECTION. INTERFACES i4.ENDCLASS.

CLASS c1 IMPLEMENTATION. METHOD i1~meth. ... ENDMETHOD. METHOD i2~meth. ... ENDMETHOD. METHOD i3~meth. ... ENDMETHOD.ENDCLASS.

No Problem!

Each interface is implemented once.

All interfaces are implemented at the same level.

Each interface component is unique.

Page 12: Advanced  ABAP Objects Programming

Composing Interfaces – Aliases

INTERFACE i1. METHODS m1.ENDINTERFACE.

Outside: Narrowing cast.INTERFACE i2. INTERFACES i1. ALIASES m2 FOR i1~m1.ENDINTERFACE.

INTERFACE i3. INTERFACES i2. ALIASES m3 FOR i2~m2.ENDINTERFACE.

FOR i2~i1~m1.

DATA: iref1 TYPE REF TO i1, iref3 TYPE REF TO i3.

iref1 = iref3.iref1->m1( ).iref3->m3( ).

iref3->i2~i1~m1( ).

Inside: Access to deep components of compound interfaces via aliases only.

Page 13: Advanced  ABAP Objects Programming

Polymorphism

Polymorphism

Accessing different methods in different objects and with different behavior via the same interface.

You access objects via reference variables.

You can use one and the same reference variable to access various objects.

What is the technical background?

Page 14: Advanced  ABAP Objects Programming

Polymorphism – Reference Variables

Object:

Instance of a class.

Reference Variable:

Typed with a class or an interface

Reference Variable Types:

CREATE OBJECT oref TYPE class.

DATA oref TYPE REF TO class|interface. oref

Static Type - from typingDynamic Type - class of object

Page 15: Advanced  ABAP Objects Programming

Polymorphism – Static and Dynamic Types

Golden Rule

The static type must be more general than or equal to the dynamic type.

If the static type is an interface, the dynamic type must implement the interface.

If the static type is a class, the dynamic type must be the same class or one of its subclasses.

Different static and dynamic types:Polymorphism

Page 16: Advanced  ABAP Objects Programming

Polymorphism – Reference Variable Assignments

Two cases for assignments:

1. Golden rule can be tested statically:

Narrowing (Up) Cast

2. Golden rule cannot be tested statically:

Widening (Down) Cast

Static type of target is more general than or equal to static type of source.

Static type of target is more special than static type of source.

Page 17: Advanced  ABAP Objects Programming

Polymorphism – Narrowing Cast

Static types of target and source are classes:Target class is superclass of or the same as source class.

Static types of target and source are interfaces:Target interface is component of or the same as source interface.

Static type of target is interface and static type of source is class:Target interface is implemented in source class or one of its super classes.

Static type of target is class and static type of source is interface:Target class is the root class “object“.

Static tests of golden rule:

Page 18: Advanced  ABAP Objects Programming

Polymorphism – Widening Cast

All cases that cannot be handled by narrowing cast.

No other assignments possible than with casting operator ?= (MOVE ... ?TO ...).

No static tests of golden rule possible:

DATA: oref1 TYPE REF TO class,

oref2 TYPE REF TO interface.

...

CREATE OBJECT oref1 TYPE class.

...

TRY.

oref1 ?= oref2.

CATCH cx_sy_move_cast_error.

...

ENDTRY.

Page 19: Advanced  ABAP Objects Programming

Polymorphic Event Handling

Principle

The event handler defines the objects that can trigger the event handler method.

Inheritance case:

METHODS handler FOR EVENT evt OF class.

EVENTS evt

class

Page 20: Advanced  ABAP Objects Programming

Polymorphic Event Handling – Type Check

Strict type check for event handler during registration.

Object type behind FOR EVENT OF in declaration of handler must be more general or the same as static type of trigger.

CLASS c1 DEFINITION. PUBLIC SECTION. EVENTS e1.ENDCLASS.

CLASS c2 DEFINITION INHERITING FROM c1. ...ENDCLASS.

CLASS c3 DEFINITION. PUBLIC SECTION. CLASS-METHODS handler FOR EVENT e1 OF c2.ENDCLASS.

DATA trigger TYPE REF TO c1.

SET HANDLER c3=>handler FOR trigger.

DATA trigger TYPE REF TO c2.

SET HANDLER c3=>handler FOR trigger.

6.10

CLASS c3 DEFINITION. PUBLIC SECTION. CLASS-METHODS handler FOR EVENT e1 OF c1.ENDCLASS.

Page 21: Advanced  ABAP Objects Programming

Polymorphic Event Handling – Type of Sender

New data type of sender.

Data type of the implicit event parameter sender is the object type class or interface behind FOR EVENT OF.

Before release 6.10 the type was defined by the class or interface where the event was declared.

CLASS c_handler DEFINITION. PUBLIC SECTION. [CLASS-]METHODS handler FOR EVENT evt OF class|interface IMPORTING sender ...ENDCLASS.

6.10

Page 22: Advanced  ABAP Objects Programming

Visibility and Access

Read-Only Attributes

Attributes in Internal Tables

Dynamic Access

Restricted Instantiation

Friends

Page 23: Advanced  ABAP Objects Programming

Visibility – Read-Only Attributes

CLASS c1 DEFINITION. PUBLIC SECTION. METHODS get_a1 RETURNING r1 ... PRIVATE SECTION. DATA a1 TYPE ...ENDCLASS.

CLASS c1 IMPLENTATION. METHOD get_a1. r1 = a1. ENDMETHOD. ENDCLASS.

CLASS c1 DEFINITION. PUBLIC SECTION. DATA a1 TYPE ... READ-ONLY. ...ENDCLASS.

Text book style ...Text book style ...but performance?

Page 24: Advanced  ABAP Objects Programming

Access – Attributes in Internal Table Operations

DATA: BEGIN OF itab_line, idx TYPE i, oref TYPE REF TO class|interface, END OF itab_line.

DATA itab LIKE TABLE OF itab_line.

SORT itab BY oref->attr ...

DELETE itab WHERE oref->attr = ...

READ TABLE itab INTO itab_line WITH KEY oref->attr = ...

MODIFY itab FROM itab_line TRANSPORTING oref WHERE oref->attr = ...

LOOP AT itab INTO itab_line WHERE oref->attr > 1. ...ENDLOOP.

Did you know?

Page 25: Advanced  ABAP Objects Programming

Access – Dynamic Access

DATA oref TYPE REF TO object.FIELD-SYMBOLS <fs> TYPE ANY.DATA attr TYPE string.

create object oref type class.

attr = 'ATTR'.ASSIGN oref->(attr) TO <fs>.

attr = 'OREF->ATTR'.ASSIGN (attr) TO <fs>.

Principle: Access to all visible components

Static type more general than dynamic type.

Static access only to statically known components.

Dynamic Access

Check by sy-subrcor IS ASSIGNED .

6.10

Page 26: Advanced  ABAP Objects Programming

Access – Restricted Instantiation

Declaration of constructor in public section.

Constructor is called by CREATE OBJECT statement

Constructor visibility set implicitly by CREATE addition.

Subclasses inherit constructor visibility or override it.

But: Subclasses of superclass with addition CREATE PRIVATE cannot be instantiated (exception: FRIENDS)They always inherit the implicit addition CREATE NONE.Classes with addition CREATE PRIVATE should be FINAL.

Visibility of Instance Constructor

CLASS class DEFINITION. PUBLIC SECTION. ??? METHODS constructor ...

CLASS class DEFINITION CREATE PUBLIC|PROTECTED|PRIVATE. PUBLIC SECTION. METHODS constructor ...

Page 27: Advanced  ABAP Objects Programming

CLASS class DEFINITION CREATE PROTECTED|PRIVATE. ... PROTECTED|PRIVATE SECTION.

Access – Friends

A class can offer friendship to other classes or interfaces.

Subclasses of friends and all classes/interfaces that implement a friend interface are also friends.

Friends have access to all components of a class.

Friends can allways instantiate a class.

A class offering friendship is not automatically friend of its friends.

Offering friendship is not inherited by subclasses.

Giving up Protection and Privacy

CLASS class DEFINITION CREATE PROTECTED|PRIVATE FRIENDS classes interfaces ... ... PROTECTED|PRIVATE SECTION.

6.10

Page 28: Advanced  ABAP Objects Programming

Method Call

Functional Methods

Short Form for Static Invoke

Dynamic Invoke

Invoke via OO-Transaction

Page 29: Advanced  ABAP Objects Programming

Method Call – Functional Methods

Short forms can be used in operand positions.

Methods with one RETURNING PARAMETER.

meth( ).

meth( a ).

meth( pi = ai ... ).

Built-in functions also in above operand positions.6.10

METHODS meth IMPORTING ... pi ... RETURNING VALUE(r) TYPE ...

f = meth( ).

[COMPUTE] r = f + meth( ).

... meth( ) > f.

CASE meth( ). WHEN meth( ).

Page 30: Advanced  ABAP Objects Programming

CALL METHOD meth EXPORTING pi = ai ... IMPORTING pj = aj ...

CALL METHOD meth( ).

CALL METHOD meth( a ).

CALL METHOD meth( pi = ai ... ).

Method Call – Short Form for Static Invoke

When the passing of parameters is done in parenthesis, the keyword CALL METHOD is not necessary .

CALL METHOD optional in Static Invoke

CALL METHOD meth( EXPORTING pi = ai ... IMPORTING pj = aj ... ).

CALL METHOD meth( ).

CALL METHOD meth( a ).

CALL METHOD meth( pi = ai ... ).

meth( EXPORTING pi = ai ... IMPORTING pj = aj ... ).

meth( ).

meth( a ).

meth( pi = ai ... ).

4.66.10

* Examples

transaction_manager->start( ).

html_viewer->show_url( url ).

Page 31: Advanced  ABAP Objects Programming

Method Call – Dynamic Invoke

PARAMETER-TABLE also in CALL FUNCTION.

Dynamic Passing of Parameters

TYPE-POOLS abap.

DATA: ptab TYPE abap_parmbind_tab, ptab_line LIKE LINE OF ptab.

ptab_line-name = 'P'.GET REFERENCE OF a INTO ptab_line-value.INSERT ptab_line INTO TABLE ptab.

TRY. meth = 'METH'. CALL METHOD oref->(meth) PARAMETER-TABLE ptab. CATCH cx_sy_dyn_call_error. ...ENDTRY.

6.10

Page 32: Advanced  ABAP Objects Programming

Method Call – OO-Transaction

Calling the transaction loads the program into an own internal mode, instantiates the class and executes the method.

Transaction Code

6.10

Program

PROGRAM demo_oo_transaction.

CLASS demo_class DEFINITION. PUBLIC SECTION. METHODS instance_method.ENDCLASS.

CLASS demo_class IMPLEMENTATION. METHOD instance_method. ... ENDMETHOD.ENDCLASS.

Object Services

Global or Local

Page 33: Advanced  ABAP Objects Programming

Object Services 6.10

Introduction

Transparent Object Persistence

Handling persistent Objects

Additional transaction service

Page 34: Advanced  ABAP Objects Programming

Object Services - Introduction 6.10

Object services are language-related services that are not part of the language itself,

provide a level of abstraction between ABAP programs and the runtime environment,

support object-oriented handling of persistent data and transactions,

are realized in the Class Library in classes CL_OS_... and interfaces IF_OS_... .

ABAP program

Database

Object Services

Persistentobjects

System and class-specific agents

ABAP runtime environment

Page 35: Advanced  ABAP Objects Programming

Object Services - Transparent Object Persistence

Persistence Service

Persistent Classes

Object-relational Mapping

Persistence Representation

6.10

Page 36: Advanced  ABAP Objects Programming

Object Services - Persistence Service

Object Services offers you a transparent object persistence.

The persistence of your objects is managed by the persistence service.

The persistence service loads your objects.

The persistence service tracks the changes made to your objects.

The persistence service stores your (changed) objects.

6.10

Page 37: Advanced  ABAP Objects Programming

Object Services - Persistent Classes

The persistence service handles instances of persistent classes. With the Class Builder, you can create a persistent class.

6.10

Page 38: Advanced  ABAP Objects Programming

Object Services - Object-Relational Mapping

Mapping classes to tables and objects to table rows is called the object-relational mapping.

CL_CARRIER

CARRIDCARRNAME...

CARRID = LH

CARRNAME = Lufthansa

...

SCARR

CARRID CARRNAME...

...LH Lufthansa ......

6.10

Page 39: Advanced  ABAP Objects Programming

For a persistent class, the object-relational mapping can be defined within the Class Builder.

The „persistence representation“ tool can be accessed using the button .

Here, starting with fields of an existing table, persistent attributes can be created.

Object Services - Persistence Representation

Persistence

6.10

Page 40: Advanced  ABAP Objects Programming

Object Services - Handling Persistent Objects 6.10

Accessor Methods

Life Cycle Management Methods

Class Agents

Loading, Creating, Deleting, ...

Object Identity

Persistent Object References

Page 41: Advanced  ABAP Objects Programming

Object Services - Accessor Methods 6.10

The Class Builder generates accessor methods for each attribute of a persistent class.

The attribute A of a persistent class can only be accessed with the methods GET_A and SET_A.

The accessor methods inform the persistence service of attribute access.

Page 42: Advanced  ABAP Objects Programming

6.10

Object Services - Life Cycle Management Methods

With the life cycle management methods, you can handle the life cycle of persistent instances.

Methods for creating persistent instances.

Methods for loading persistent instances.

Methods for deleting persistent instances.

A persistent instance has one of the following life cycle states: NEW, LOADED, CHANGED, DELETED, NOT_LOADED.

Page 43: Advanced  ABAP Objects Programming

Object Services - Class Agents 6.10

The life cycle management methods are provided by the class agent.

The class agent is generated by the Class Builder.

The class agent for the persistent class CL_X is named CA_X.

The class agent is a singleton and has a class attribute AGENT containing an object reference to this singleton.

Page 44: Advanced  ABAP Objects Programming

Object Services - Loading a Persistent Object

DATA: CARRIER TYPE REF TO CL_CARRIER, CARRIER_AGENT TYPE REF TO CA_CARRIER,

CARRNAME TYPE S_CARRNAME.

CARRIER_AGENT = CA_CARRIER=>AGENT.

TRY. CARRIER = CARRIER_AGENT->GET_PERSISTENT( I_CARRID = 'LH' ). CARRNAME = CARRIER->GET_CARRNAME( ). WRITE: 'LH: ', CARRNAME. CATCH CX_OS_OBJECT_NOT_FOUND.ENDTRY.

6.10

A persistent object can be loaded with the class agent method GET_PERSISTENT.

Page 45: Advanced  ABAP Objects Programming

Object Services - Creating a Persistent Object

DATA: CARRIER TYPE REF TO CL_CARRIER, CARRIER_AGENT TYPE REF TO CA_CARRIER.

CARRIER_AGENT = CA_CARRIER=>AGENT.

TRY. CARRIER = CARRIER_AGENT->CREATE_PERSISTENT( I_CARRID = 'LH' ). CARRIER->SET_CARRNAME('Lufthansa' ). CATCH CX_OS_OBJECT_EXISTING.ENDTRY.

COMMIT WORK.

6.10

A persistent object can be created with the class agent method CREATE_PERSISTENT.

Page 46: Advanced  ABAP Objects Programming

Object Services - Deleting a Persistent Object

DATA: CARRIER_AGENT TYPE REF TO CA_CARRIER.

CARRIER_AGENT = CA_CARRIER=>AGENT.

TRY. CARRIER_AGENT->DELETE_PERSISTENT( I_CARRID = 'LH' ). CATCH CX_OS_OBJECT_NOT_EXISTING.ENDTRY.

COMMIT WORK.

6.10

A persistent object can be deleted with the class agent method DELETE_PERSISTENT.

Page 47: Advanced  ABAP Objects Programming

Object Services – Object Identity

Object identity business key:The object identity is controlled by the application. (The business keys are the attributes mapped to the primary key fields of the table mapped to this persistent class.)

Object identity GUID:The object Identity is controlled by the persistence service. (There‘s a GUID related to each persistent object. The GUID is not an attribute of the persistent class, but the primary key field of the table mapped to this persistent class.)

6.10

Page 48: Advanced  ABAP Objects Programming

Object Services – Persistent Object References

A persistent attribute can be a reference to another persistent object with object identity GUID.

Runtime references are converted to persistent references during database access (and vice versa).

The persistent service supports transparent navigation.A referenced object is not loaded until it is accessed.

6.10

Page 49: Advanced  ABAP Objects Programming

Object Services – Transaction Service 6.10

Transaction service

Transactions

Nested transactions

Transactions and the SAP-LUW

Page 50: Advanced  ABAP Objects Programming

Object Services – Transaction Service 6.10

Object Services offers you an additional transaction service.

Inside an OO-transaction (with OO transaction model checked) you must use the transaction service with the specified update mode.

Page 51: Advanced  ABAP Objects Programming

Object Services – Transactions

DATA: TM TYPE IF_OS_TRANSACTION_MANAGER.DATA: T TYPE IF_OS_TRANSACTION. TM = CL_OS_SYSTEM=>GET_TRANSACTION_MANAGER( ).T = TM->CREATE_TRANSACTION( ). T->START( ).* Inside the transaction T->END( ).

6.10

Transactions are managed by the transaction manager (singleton created by the runtime system).

A transaction is represented by a transaction object.

A transaction is started by the START and completed by the END method (UNDO rolls the transaction back).

Page 52: Advanced  ABAP Objects Programming

Object Services – Nested Transactions 6.10

Object Services support nested transactions.

Within a transaction, a subtransaction can be started.

The top-level transaction is the transaction that is active and not a subtransaction.

If UNDO is called for a subtransaction, the state of the instances is restored in memory.

If END is called for a subtransaction , the before-image of the changed instances is discarded.

Page 53: Advanced  ABAP Objects Programming

6.10Object Services – Transactions and the SAP-LUW

The object services transactions are tightly coupled with the SAP-LUW concept. There are two scenarios for this coupling.

A legacy application (standard ABAP application) calls object services components (components using object services persistence service). The legacy application executes COMMIT WORK.

An object services application (application using object services persistence and transaction service) calls legacy components (standard ABAP components). At top-level transaction completion (using the method END), the transaction services executes COMMIT WORK implicitly.