Show TOC Anfang des Inhaltsbereichs

Methoden deklarieren und aufrufen  Dokument im Navigationsbaum lokalisieren

Dieser Abschnitt gibt einen Überblick über das Arbeiten mit Methoden in ABAP Objects. Für genauere Informationen zu den Anweisungen lesen Sie bitte die entsprechende Schlüsselwortdokumentation. Das Beispiel zu Methoden in ABAP Objects zeigt die Deklaration, Implementierung und den Aufruf von Methoden im Zusammenhang.

Methodendeklaration

Methoden werden im Deklarationsteil einer Klasse oder in einem Interface deklariert. Zum Deklarieren von Instanzmethoden dient die Anweisung

METHODS meth IMPORTING [VALUE(]i1  i2 ... [)] TYPE type [OPTIONAL]...
             EXPORTING [VALUE(]
e1  e2 ... [)] TYPE type ...
             CHANGING  [VALUE(]
c1  c2 ... [)] TYPE type [OPTIONAL]...
             RETURNING VALUE(r)
             EXCEPTIONS
exc1  exc2 ... .

mit ihren Zusätzen.

Zum Deklarieren von statischen Methoden dient die Anweisung

CLASS-METHODS meth...

Beide Anweisungen haben die gleiche Syntax.

Bei der Methodendeklaration wird die Parameterschnittstelle einer Methode deklariert. Hierzu dienen die Zusätze IMPORTING, EXPORTING, CHANGING und RETURNING. Mit diesen Zusätzen werden Eingabe-, Ausgabe-, Eingabe/Ausgabeparameter sowie ein Rückgabewert definiert. Gleichzeitig werden die Eigenschaften der Schnittstellenparameter festgelegt, also ob ein Schnittstellenparameter per Referenz oder Wert (VALUE) übergeben wird, wie ein Parameter typisiert ist (TYPE) und ob ein Eingabeparameter optional (OPTIONAL, DEFAULT) ist. Im Unterschied zu Funktionsbausteinen ist bei Methoden die Referenzübergabe die Voreinstellung. Um Parameter als Wert zu übergeben, muss dies durch die VALUE-Kennung festgelegt werden. Der Rückgabewert (RETURNING-Parameter) muss immer explizit als Wert übergeben werden. Er ist für Methoden geeignet, die genau einen Ausgabewert liefern sollen und schließt die gleichzeitige Verwendung von EXPORTING- und CHANGING-Parametern aus.

Wie bei Funktionsbausteinen ermöglichen es Ausnahmeparameter (EXCEPTIONS) dem Verwender, auf Ausnahmesituationen während der Ausführung der Methode zu reagieren.

Methodenimplementierung

Alle Methoden einer Klasse müssen im Implementierungsteil der Klasse zwischen den Anweisungen

METHOD meth.
 ...
ENDMETHOD.

implementiert werden. Bei der Implementierung einer ist keine Angabe von Schnittstellenparametern erforderlich, da diese ausschließlich bei der Deklaration der Methode festgelegt werden. Die Schnittstellenparameter einer Methoden werden innerhalb der Methodenimplementierung wie lokale Variablen behandelt. Zusätzlich zu den Schnittstellenparametern können in einer Methode weitere lokale Variablen mit der DATA-Anweisung deklariert werden.

Wie in Funktionsbausteinen können auch in Methoden die Anweisungen RAISE exception und MESSAGE RAISING verwendet werden, um Ausnahmesituationen zu behandeln.

Bei der Implementierung einer statische Methode ist zu beachten, dass sie nur mit den statischen Attributen ihrer Klasse arbeiten kann, während eine Instanzmethode auch Instanzattribute adressieren kann.

Statischer Methodenaufruf

Der Aufruf einer Methode erfolgt mit der Anweisung:

CALL METHOD meth EXPORTING  i1 = f1  i2 =f2  ... 

                 IMPORTING  e1 = g1  e2 =g2  ...
                 
CHANGING   c1 = f1  c2 =f2  ...
                 RECEIVING          r = h
                 EXCEPTIONS e1 = rc1 e2 =rc2  ...

Die Art der Adressierung der Methode method richtet sich danach, von wo aus welche Methode aufgerufen wird. Innerhalb einer Klasse können im Implementierungsteil die Methoden der gleichne Klasse direkt über ihren Namen meth aufgerufen werden:

CALL METHOD meth...

Von außerhalb der Klasse richtet sich die Aufrufbarkeit der Methode nach ihrer Sichtbarkeit, also in welchem Sichtbarkeitsbereich der Klasse ihre Deklaration stattfindet. Sichtbare Instanzmethoden werden von außen über

CALL METHOD ref->meth...

Aufgerufen. Dabei ist ref eine Referenzvariable, deren Wert auf eine Instanz der Klasse zeigt. Sichtbare statische Methoden werden von außen über

CALL METHOD =>meth...

aufgerufen, wobei class der Name der jeweiligen Klasse ist.

Beim Aufruf einer Methode müssen alle nicht optionalen Eingabeparameter mit dem EXPORTING- bzw. CHANGING-Zusatz der Anweisung CALL METHOD übergeben werden. Die Ausgabeparameter können, müssen aber nicht, mit dem IMPORTING- bzw. RECEIVING-Zusatz übernommen werden. Ebenso entscheidet der Aufrufer, ob er in der Methode ausgelöste Ausnahmen mit dem EXCEPTIONS-Zusatzbehandelt oder nicht. Die Behandlung der Ausnahmen ist empfohlen.

Die Übergabe bzw: Übernahme von Werten erfolgt wie bei Funktionsbausteinen durch die Syntax

... Formalparameter = Aktualparameter

hinter dem entsprechenden Zusatz. Die Schnittstellen- bzw. Formalparameter stehen immer links vom Gleichheitszeichen (=), die Aktualparameter stehen immer rechts. Das Gleichheitszeichen ist in diesem Zusammenhang also kein Zuweisungsoperator, sondern dient allein der Zuordnung zwischen Programmvariablen und der Methodenschnittstelle.

Falls die Schnittstelle einer Methode aus nur einem einzigen IMPORTING-Parameter besteht, dann, und nur dann, kann folgende Kurzform für den Methodenaufruf verwendet werden:

CALL METHOD method( f ).

Der Aktualparameter f wird an den Eingabeparameter der Methode übergeben.

Falls die Schnittstelle einer Methode nur aus IMPORTING-Parametern besteht, dann, und nur dann, kann diese Kurzform für den Methodenaufruf verwendet werden:

CALL METHOD method( i1 = f1  i2 = f2 ...).

Die Aktualparameter f1f2 ... werden an die Formalparameter i1  i2 … übergeben.

Dynamischer Methodenaufruf

Methoden können mit der in ABAP üblichen Klammersemantik dynamisch aufgerufen werden:

·              Aufruf einer Instanzmethode meth:

CALL METHOD ref->(f)

·        Aufruf einer statischen Methode meth:

CALL METHOD class=>(f)
CALL METHOD (c)=>meth
CALL METHOD (c)=>(f)

·        Aufruf einer eigenen Methode meth:

CALL METHOD (f)
CALL METHOD ME->(f)

Dabei sind f und c Felder, die den Namen der Methode meth oder der Klasse class enthalten. Anders als bei Unterprogrammen und Funktionsbausteinen ist es beim dynamischen Methodenaufrufen möglich, auch die Aktualparameter dynamisch zu übergeben. Hierzu dienen die Zusätze PARAMETER-TABLE und EXCEPTION-TABLE der Anweisung CALL METHOD:

CALL METHOD ... PARAMETER-TABLE ptab
                EXCEPTION-TABLE etab.

Die Parameter-Tabelle ptab muss eine Hash-Tabelle vom Tabellentyp ABAP_PARMBIND_TAB bzw. vom Zeilentyp ABAP_PARMBIND sein. Diese Typen sind im ABAP Dictionary definiert. Die Tabelle hat die drei Spalten:

·        NAME für den Namen des Formalparameters

·        KIND für die Art der Parameterübergabe

·        VALUE vom Typ REF TO DATA für den Wert des Aktualparameters

Die Spalte NAME ist der eindeutige Tabellenschlüssel. Für jeden nichtoptionalen Parameter muss, für jeden optionalen Parameter kann genau eine Zeile der internen Tabelle gefüllt werden.

Die Art der Parameterübergabe ist in der Deklaration der aufgerufenen Methode für jeden Formalparameter festgelegt. Der Inhalt der Spalte KIND kann daher initial sein. Falls die Art der Parameterübergabe zur Laufzeit überprüft werden soll, kann der Spalte KIND eine der folgenden Konstanten aus der globalen Klasse CL_ABAP_OBJECTDESCR zugewiesen werden:

·        CL_ABAP_OBJECTDESCR=>EXPORTING für EXPORTING-Parameter

·        CL_ABAP_OBJECTDESCR=>IMPORTING für IMPORTING-Parameter

·        CL_ABAP_OBJECTDESCR=>CHANGING  für CHANGING-Parameter

·        CL_ABAP_OBJECTDESCR=>RECEIVING für RECEIVING-Parameter

Die Bezeichnungen richten sich nach der Sicht des Aufrufers. Falls angegebene und tatsächliche Parameterart nicht übereinstimmen, wird der abfangbare Laufzeitfehler DYN_CALL_METH_PARAM_KIND erzeugt. Weiterhin können die Einträge in der Spalte KIND als zusätzlicher Schlüssel dienen, beispielsweise zum Auslesen sämtlicher importierter Werte nach dem Methodenaufruf. Für den Wert des Aktualparameters muss die Referenz VALUE der Tabellenzeile auf ein Datenobjekt zeigen, das den gewünschten Wert enthält. Hierfür kann der Befehl GET REFERENCE verwendet werden.

Die Ausnahme-Tabelle etab muss eine Hash-Tabelle vom Tabellentyp ABAP_EXCPBIND_TAB bzw. vom Zeilentyp ABAP_EXCPBIND sein. Diese Typen sind im ABAP Dictionary definiert. Die Tabelle hat die zwei Spalten

·        NAME für den Namen der Ausnahme

·        VALUE vom Typ i für den sy-subrc zuzuweisenden Wert

Die Spalte NAME ist der eindeutige Tabellenschlüssel. Für jede Ausnahme kann genau eine Zeile der internen Tabelle gefüllt werden. Dabei wird der Komponente VALUE der Zahlenwert zugewiesen, der nach Auslösen der Ausnahme in sy-subrc stehen soll.

Funktionale Methoden

Funktionale Methoden sind Methoden mit beliebig vielen IMPORTING-Parametern und einem RETURNING-Parameter. Funktionale Methoden können außer mit CALL METHOD durch folgende Ausdrücke an Operandenpositionen aufgerufen werden:

IMPORTING-Parameter

Ausdruck

keine

meth( )

ein

meth( f ) oder meth( p = f )

n

meth( p1 = f1 ... pn = fn )

Diese Schreibweise ist zur Zeit möglich:

·        für das Quellfeld der MOVE-Anweisung

·        in arithmetischen Ausdrücken der COMPUTE-Anweisung

·        in Logischen Ausdrücken

·        in der CASE-Anweisung der CASE-Kontrollstruktur

·        in der WHEN-Anweisung der CASE-Kontrollstruktur

·        in der WHERE-Bedingung der Anweisungen LOOP AT, DELETE und MODIFY für interne Tabellen

Die funktionale Methode wird anstelle eines Operanden eingetragen. Bei Ausführung der Anweisung wird die Methode aufgerufen und der zurückgegebene RETURNING-Parameter als Operand verwendet.

Ereignisbehandlermethoden

Ereignisbehandlermethoden sind spezielle Methoden, die nicht nur mit der Anweisung CALL METHOD aufgerufen werden können, sondern auch über Ereignisse auslösbar sind. Ereignisbehandlermethoden werden mit dem Zusatz

... FOR EVENT evt OF cif ...

der Anweisungen METHODS bzw. CLASS-METHODS deklariert.

Für die Schnittstelle einer Ereignisbehandlermethode bestehen folgende Besonderheiten:

·        Die Schnittstelle darf nur aus IMPORTING-Parametern bestehen.

·        Jeder IMPORTING-Parameter muss ein EXPORTING-Parameterdes Ereignisses evt sein.

·        Die Eigenschaften der Parameter werden bei der Deklaration des Ereignisses evt mit der Anweisung EVENTS festgelegt und von der Ereignisbehandlermethode übernommen.

Mehr zu Ereignisbehandlermethoden und Ereignissen finden Sie unter Ereignisse auslösen und behandeln.

Konstruktoren

Konstruktoren sind spezielle Methoden, die nicht mit CALL METHOD aufgerufen werden können, sondern vom System automatisch ausgeführt werden, um einen definierten Anfangszustand für Objekte oder Klassen herzustellen. Wir unterscheiden zwischen Instanz- und statischen Konstruktoren. Konstruktoren sind Methoden mit vordefinierten Namen. Um sie zu verwenden, müssen sie explizit in der Klasse deklariert werden.

Der Instanzkonstruktor eine Klasse ist die vordefinierte Instanzmethode constructor und wird im öffentlichen Bereich über

METHODS CONSTRUCTOR
        IMPORTING [VALUE(]
i1  i2 ...[)] TYPE type [OPTIONAL]...
        EXCEPTIONS
exc1  exc2 ... .

deklariert und wie jede gewöhnliche Methode im Implementierungsteil implementiert. Das System ruft den Instanzkonstruktor für jede Instanz der Klasse genau einmal auf, und zwar direkt nach der vollständigen Erzeugung der Instanz mit der Anweisung CREATE OBJECT. Die Eingabeparameter und die Ausnahmen des Instanzkonstruktors werden bei der Erzeugung einer Instanz mit der Anweisung CREATE OBJECT mit deren Zusätzen EXPORTING und EXCEPTIONS übergeben bzw. behandelt.

Der statische Konstruktor einer Klasse ist die vordefinierte statische Methode class_constructor und wird im öffentlichen Bereich über

CLASS-METHODS CLASS_CONSTRUCTOR.

deklariert und wie jede gewöhnliche Methode im Implementierungsteil implementiert. Der statische Konstruktor hat keine Parameter. Das System ruft den statischen Konstruktor für jede Klasse genau einmal auf, und zwar vor dem ersten Zugriff auf die Klasse. Innerhalb des statischen Konstruktors kann deshalb nicht auf seine eigene Klasse zugegriffen werden.

Im Beispiel zu Methoden in ABAP Objects wird auch die Verwendung von Instanz- und statischen Konstruktoren gezeigt.

 

 

Ende des Inhaltsbereichs