
Die objektorientierte Programmierung basiert auf der Kapselung von Daten und Funktionalität in Klassen, von denen Instanzen (Objekte) erzeugt werden. Polymorphie wird in ABAP durch Einfachvererbung und Interfaces unterstützt. Klassen und Interfaces können lokal in einem beliebigen ABAP-Programm oder mit dem Class Builder global in der Klassenbibliothek angelegt werden. Lokale Klassen und Interfaces sind nur im definierenden Programm, globale systemweit verwendbar.
Klassen
Klassen werden zwischen den Anweisungen CLASS und ENDCLASS definiert. Eine Klassendefinition besteht aus einem Deklarationsteil für die Deklaration ihrer Komponenten und einem Implementierungsteil für die Implementierung ihrer Methoden. Mögliche Komponenten einer Klasse sind Attribute, Methoden, Ereignisse, Typen und Konstanten. Die Anweisungen DATA, METHODS und EVENTS deklarieren Instanzkomponenten, die an Objekte gebunden sind. Mit CLASS-DATA, CLASS-METHODS und CLASS-EVENTS sowie TYPES und CONSTANTS werden instanzunabhängige statische Komponenten deklariert.
Methoden werden mit der Anweisung METHODS und deren Zusätzen IMPORTING, EXPORTING, CHANGING und RETURNING für ihre Parameterschnittstelle sowie RAISING für die zugelassenen Ausnahmen im Deklarationsteil einer Klasse deklariert und zwischen den Anweisungen METHOD und ENDMETHOD im Implementierungsteil der Klasse implementiert. Der Aufruf von Methoden erfolgt durch statische Angabe des Methodennamens meth( ... ) oder über die Anweisung CALL METHOD (meth) für dynamische Aufrufe. Der Instanzkonstruktor hat den vordefinierten Namen constructor, der statische Konstruktor den Namen class_constructor. Destruktoren können in ABAP nicht implementiert werden. Methoden mit einem Rückgabewert ( RETURNING-Parameter) werden als funktionale Methoden bezeichnet. Aufrufe funktionaler Methoden können in logischen Ausdrücken und Rechenausdrücken direkt an Operandenpositionen angegeben werden.
Ereignisse werden mit der Anweisung EVENTS deklariert und können in den Methoden der Klasse mit RAISE EVENT ausgelöst werden. Diese objektorientierten Ereignisse stehen in keiner Verbindung mit den Ereignissen der Laufzeitumgebung. Mit dem Zusatz FOR EVENT OF werden Methoden als Ereignisbehandler deklariert.
Alle Komponenten einer Klasse werden in einem von drei Sichtbarkeitsbereichen deklariert:
PUBLIC SECTION: überall sichtbar, wo die Klasse bekannt ist.
PROTECTED SECTION: innerhalb der Klasse und ihrer Unterklassen sichtbar.
PRIVATE SECTION: nur innerhalb der Klasse sichtbar.
Klassen können über den Zusatz INHERITING FROM als Unterklassen von genau einer Oberklasse erben. In Unterklassen können von der Oberklasse geerbte Methoden redefiniert werden. In der Vererbung kann es abstrakte und finale Klassen geben.
Klassen mit dem Zusatz FOR TESTING sind spezielle Tesklassen für ABAP Unit.
Interfaces
Interfaces werden zwischen den Anweisungen INTERFACE und ENDINTERFACE definiert. Es können die gleichen Komponenten wie in Klassen deklariert werden. Ein Interface hat keine Sichtbarkeitsbereiche und keinen Implementierungsteil. Interfaces werden mit der Anweisung INTERFACES im öffentlichen Sichtbarkeitsbereich einer Klasse eingebunden. Dadurch werden deren Komponenten in die Klasse übernommen. Die Interface-Methoden müssen in der Klasse implementiert werden. Über Interface-Referenzen kann auf Instanzen von Klassen zugegriffen werden, die das entsprechende Interface implementieren.
Objekte
Objekte werden mit der Anweisung
CREATE OBJECT oref TYPE class.
oder dem Konstruktoroperator
oref = NEW class( ... ).
erzeugt. Dabei ist oref eine Objektreferenzvariable (Klassenreferenz oder Interface-Referenz), die nach der Erzeugung auf das Objekt zeigt, und class die Klasse des Objekts. Der Typ einer Objektreferenzvariablen muss immer allgemeiner oder gleich der Klasse des Objekts sein. Ist der Typ der Objektreferenzvariablen gleich dem Typ des zu erzeugenden Objekts, kann der Zusatz TYPE mit der Klassenangabe entfallen bzw das Zeichen # hinter NEW verwendet werden. In Instanzmethoden enthält die vordefinierte Referenzvariable me eine Referenz auf das aktuelle Objekt.
Beispiel
Definition eines Interfaces if_counter für einen Zähler und Einbinden in eine Klasse cl_counter. Erzeugung eines Objekts und seine Verwendung über eine Interface-Referenz counter.
INTERFACE if_counter.
METHODS: reset,
increment,
get_counts RETURNING value(count) TYPE i.
ENDINTERFACE.
CLASS cl_counter DEFINITION.
PUBLIC SECTION.
METHODS constructor IMPORTING offset TYPE i.
INTERFACES if_counter.
PRIVATE SECTION.
DATA count TYPE i.
ENDCLASS.
CLASS cl_counter IMPLEMENTATION.
METHOD constructor.
count = offset.
ENDMETHOD.
METHOD if_counter~reset.
count = 0.
ENDMETHOD.
METHOD if_counter~increment.
count = count + 1.
ENDMETHOD.
METHOD if_counter~get_counts.
count = me->count.
ENDMETHOD.
ENDCLASS.
...
START-OF-SELECTION.
DATA counter TYPE REF TO if_counter.
counter = NEW cl_counter( 10 ).
counter->increment( ).
DATA(counts) = counter->get_counts( ).
counter->reset( ).