Az ABAP programozási nyelv

Objektum-orientált programozás, öröklődés



Általános

Az objektum-orientált programozás támogatása a nyelvben a 4.0-ás verziótól van jelen, és az SAP-Business-Objektumokon alapul. Az ABAP az egységbezárás, öröklődés és polimorfizmus segítségével támogatja az objektumorientált programfejlesztést. Osztály- és interfészdefiníciók vagy globálisan egy osztálykönyvtárban (un. Object-Repository) hozhatók létre, vagy lokálisan egy program (pl. Reports, Modul-Pools, Függvénycsoport, stb.) tartalmazhatja.

példa kód:
*osztályok, objektumok

*egy absztrakt osztály definíciója
*a megszokott public, protcted, private részekkel
* (absztrakt) metódusokkal
*a kód magáért beszél, egy nagyon egyszerű példa
CLASS vehicle DEFINITION ABSTRACT.
PUBLIC SECTION.
METHODS: accelerate,
write_status ABSTRACT.
PROTECTED SECTION.
DATA speed TYPE i.
ENDCLASS.

*a megvalósítás
CLASS vehicle IMPLEMENTATION.
METHOD accelerate.
speed = speed + 1.
ENDMETHOD.
ENDCLASS.

*öröklődés és új metódusok bevezetése
CLASS plane DEFINITION INHERITING FROM vehicle.
PUBLIC SECTION.
METHODS: rise,
write_status REDEFINITION.
PROTECTED SECTION.
DATA altitude TYPE i.
ENDCLASS.

*az új metódus, és az örökölt megvalósítása
CLASS plane IMPLEMENTATION.
METHOD rise.
altitude = altitude + 1.
ENDMETHOD.
METHOD write_status.
WRITE: / 'Plane speed:', speed, ', altitude:', altitude.
ENDMETHOD.
ENDCLASS.

*egy másik öröklődése
CLASS ship DEFINITION INHERITING FROM vehicle.
PUBLIC SECTION.
METHODS write_status REDEFINITION.
ENDCLASS.

*megvalósítás
CLASS ship IMPLEMENTATION.
METHOD write_status.
WRITE: / 'Ship speed:', speed.
ENDMETHOD.
ENDCLASS.

*mutató típusok a létrejött objektumokra
DATA: plane_ref TYPE REF TO plane,
ship_ref TYPE REF TO ship.

START-OF-SELECTION.

*az objektumok legyártása
CREATE OBJECT: plane_ref,
ship_ref.

*az objektumokon lévő metódusok meghívása
CALL METHOD: plane_ref->accelerate,
plane_ref->rise,
plane_ref->write_status,
ship_ref->accelerate,
ship_ref->write_status.

Objektumok

Egy objektum komponense láthatóság szerint lehet nyilvános, védett vagy privát. A privát komponensek csak az osztálydefiníción belül érhetőek el. A védett tagok a közvetlen és közvetett leszármazottakban is elérhetőek. Minden más komponens nyilvános tagnak tekintendő. Ezek más programrészekből, osztálydefiníciókból láthatóak. Nyilvános tagok estén lehetőség van a külső változtatás letiltására (READ-ONLY attribútum). Létrehozható osztály szintű attribútum, mely lehet privát, védett, nyilvános valamint READ-ONLY. Ez a leszármazottakban is ugyan az. A változó osztályattribútumok mellett definiálhatóak konstansok is, melyeket osztálykonstansak is neveznek.

Objektumok három módon léphetnek kapcsolatba:

Osztályok

Objektumok felépítését az osztályok definíciója határozza meg. Osztályok között a hagyományos értelemben vett öröklődés lehetséges. Ekkor a gyermek osztály az őstől minden attribútumot és metódust örököl. Az alosztályban további komponensek vehetőek fel és a metódusok átírhatóak. Egyes osztályok között néha szükséges a privát tagok megosztása. Ezt a Friend kapcsolatot explicit módon meg kell adni mindkét osztály definíciójában. Ha az "A" osztály a "B" osztály felé ilyen barátságban van az nem vonja maga után az ellentétes irányt, azt ugyancsak definiálni kell.

Interfészek

A JAVA-ban megszokott lehetőségeket tartalmazza. Ha egy osztály implementál egy, vagy több interfészt, akkor azok minden metódustörzsét meg kell adni. Interfészek között is lehetséges öröklődés.

ALIAS-ok

Az osztályok vagy interfészek deklarációs részében megadható alias név egy interfész komponensének. Az interfészt az INTERFACES kulcsszó után include-olni kell az adott interfészben vagy osztályban. Az alias nevek az osztály vagy interfész komponensei közé tartoznak, és a többi komponenssel azonos névtérben van. Öröklődés esetén tehát az alosztályok az alias-okat is öröklik az osztálytól.
Például az alábbi módon lehet meghívni egy metódust, amelyet egy interfészben definiáltak, de egy osztályban implementáltak.

<interfésznév>~<metódus>

Ennek a metódushívásnak az egyszerűsítésére bevezethetünk alias-t az interfész-beli metódusra.

ALIASES: <új_metódusnév> FOR <interfésznév>~<metódus>.

Referencia típus

Az ABAP/4 legújabb elemi típusa a referencia. Egy objektum létrehozásakor egy referenciát kapunk vissza, mellyel az objektumhoz férhetünk hozzá. Ezeket a referenciákat referenciaváltozókban tárolhatjuk. Az üres referencia értéke egy referenciaváltozóban az INITIAL. Referenciaváltozó másolásakor nem a mutatott objektum másolódik át, hanem a referencia másolódik. Tehát két referenciaváltozó mutat ugyanarra az objektumra (Object Sharing). A referenciaváltozók tipizáltak. Egy objektum-referenciaváltozó deklarálásakor meg kell adni egy osztálynevet. Ez által az objektum-referenciaváltozó által mutatott objektum típusa meg kell egyezzen az osztály, vagy annak leszármazottjának a típusával. Egy interfész-referenciaváltozó deklarálásakor is meg kell adni egy interfésznevet. Ez által az interfész-referenciaváltozó által mutatott objektum egy ilyen interfészt implementál. Lehetőség van un. univerzális referenciaváltozó deklarálására is. Ekkor az OBJECT előre definiált osztálynevet kell megadni, mely mint implicit ős tekinthető minden osztályra nézve. Objektumok attribútumai is lehetnek referenciaváltozók és utalhatnak egy másik objektumra. Típusvizsgálat a referenciaváltozók esetén statikus, vagyis fordítási időben történik. Egy referenciaváltozó: REF TO C csakis egy C osztálynak megfelelő egyedre vagy leszármazottjára utalhat. A két referenciaváltozó akkor kompatibilis, ha O2 típusa megegyezik O1, vagy egy abból származtatott osztály típusával. Egy O1=O2 (O1, O2 referenciaváltozók) értékadás csak akkor korrekt, ha fordítási időben eldönthető, hogy a O1 és O2 kompatibilis. Akkor lehet egy interfész referenciaváltozóval egy objektum referenciaváltozó által mutatott objektumra mutatni, ha az objektum (osztály) implementálta az interfészt. Esetenként szükséges a statikus típusvizsgálat kitolása a futásidőre. Az ABAP/4-nek van erre az un. downcast-ra is egy speciális utasítása. Ekkor futásidőben lekérdezhető, hogy az objektum melyik interfészt implementálja. Ezt az esetet explicit módon tudatni kell a fordítóval.

Objektumok életciklusa

Az objektumokat dinamikusan hozzuk létre melyekre referenciákkal hivatkozhatunk. Az objektum életrehívásakor biztosítanunk kell a specifikációnak megfelelő konzisztens állapotot. Ezt az ABAP/4 a konstruktor metódus segítségével biztosítja. Egy objektum létrehozásakor ez automatikusan meghívódik és a szükséges inicializálásokat elvégzi. Minden osztályhoz pontosan egy konstruktor tartozik és a konstruktor neve megegyezik az osztály nevével. Konstruktorokat a leszármazottakban nem lehet átírni. Az ős konstruktora explicit módon hívható. Objektumok törléséről maga a rendszer gondoskodik (Garbage Collection), nem létezik a destruktor fogalma. Egy objektum egészen addig elérhető, míg létezik referencia, mely rá mutat. Ha egy objektum nem elérhető, a rendszer egy későbbi időpontban törli azt.