Anfang des Inhaltsbereichs

Klassen Dokument im Navigationsbaum lokalisieren

Klassen sind Vorlagen für Objekte. Umgekehrt kann man auch den Typ eines Objekts als seine Klasse bezeichnen. Eine Klasse ist eine abstrakte Darstellung oder bildlich gesehen eine Bauanleitung für Objekte. Zur Beschreibung der Eigenschaften von Objekten enthalten Klassen Komponenten, welche den Zustand und das Verhalten von Objekten definieren.

Lokale und globale Klassen

Die Klassen von ABAP Objects können entweder global oder lokal definiert werden. Globale Klassen und Interfaces werden mit dem Werkzeug Class Builder (Transaktion SE24) der ABAP Workbench erzeugt und zentral in Class-Pools der Klassenbibliothek im R/3-Repository abgespeichert. Alle ABAP-Programme eines R/3-Systems haben Zugriff auf die globalen Klassen. Lokale Klassen werden innerhalb eines ABAP-Programms definiert. Lokale Klassen und Interfaces können nur im definierenden Programm verwendet werden. Bei der Verwendung einer Klasse in einem ABAP-Programm, sucht das System zuerst nach einer lokalen, dann nach einer globalen Klasse des angegebenen Namens. Abgesehen von der Zugreifbarkeit gibt es in der Verwendung praktisch keine Unterscheidung zwischen globalen und lokalen Klassen.

Im Design besteht jedoch ein großer Unterschied zwischen lokalen und globalen Klassen. Bei lokalen Klassen, die in nur einem Programm verwendet werden können, reicht es normalerweise, die öffentliche Schnittstelle, d.h. die nach außen sichtbaren Komponenten, passend zu diesem Programm zu definieren. Globale Klassen sollen dagegen systemweit verwendbar sein. Dies führt zu Einschränkungen bei der Definition der öffentlichen Schnittstelle, da immer garantiert sein muß, daß jedes Programm, welches ein Objekt einer globalen Klasse verwendet, auch den Datentyp jedes Schnittstellenparameters kennt.

Die folgenden Abschnitte beschreiben die Definition lokaler Klassen und Interfaces in einem ABAP-Programm. Zur Definition globaler Klassen und Interfaces sei auf die Dokumentation des Strukturlink Class Builders der ABAP Workbench verwiesen.

Definition lokaler Klassen

Lokale Klassen bestehen aus ABAP-Quelltext, der innerhalb der Anweisungen CLASS - ENDCLASS eingeschlossen ist. Eine vollständige Klassendefinition besteht aus einem Deklarationsteil und falls erforderlich aus einem Implementationsteil. Der Deklarationsteil einer Klasse des Namens <class> besteht aus einem Anweisungsblock

CLASS <class> DEFINITION.
...
ENDCLASS.

Der Deklarationsteil enthält die Deklaration aller Komponenten (Attribute, Methoden, Ereignisse) einer Klasse. Bei lokalen Klassen gehört der Deklarationsteil von Klassen zu den globalen Datendeklarationen und sollte deshalb auch am Anfang des Programms stehen.

Falls im Deklarationsteil einer Klasse Methoden deklariert werden, benötigt die Klasse auch einen Implementationsteil. Dieser besteht aus einem Anweisungsblock

CLASS <class> IMPLEMENTATION.
...
ENDCLASS.

Der Implementationsteil einer Klasse enthält die Implementation aller Methoden dieser Klasse. Bei lokalen Klassen stellt der Implementationsteil von Klassen einen Verarbeitungsblock dar. Nachfolgendes Coding ist also nicht erreichbar, falls es nicht selbst wieder Teil eines adressierbaren Verarbeitungsblocks ist.

Aufbau von Klassen

Die folgenden Aussagen definieren den Aufbau von Klassen:

Die folgenden Abschnitte beschreiben den Aufbau von Klassen näher.

Komponenten von Klassen

Der Inhalt einer Klasse setzt sich aus Komponenten zusammen. Alle Komponenten werden im Deklarationsteil der Klasse deklariert. Die Komponenten definieren die Eigenschaften der Objekte einer Klasse. Jede Komponente wird bei der Definition der Klasse in einem der drei Sichtbarkeitsbereiche deklariert, welche die Schnittstellen nach außen definieren. Innerhalb einer Klasse sind alle ihre Komponenten sichtbar. Alle Komponenten liegen im gleichen Namensraum, d.h. die Namen aller Komponenten müssen in einer Klasse verschieden sein.

Wir unterscheiden zwischen solchen Komponenten, die instanzabhängig für jedes Objekt vorhanden sind, und solchen, die instanzunabhängig pro Klasse nur einmal vorhanden sind. Die instanzabhängigen Komponenten nennen wir Instanzkomponenten, die instanzunabhängigen Komponenten nennen wir statische Komponenten.

In ABAP Objects können Klassen die unten aufgeführten Komponenten definieren. Da alle in Klassen deklarierbaren Komponenten auch in Interfaces deklariert werden können, gilt diese Beschreibung analog auch für Interfaces.

Attribute

Attribute sind klasseninterne Datenfelder von beliebigem ABAP-Datentyp. Der Inhalt der Attribute bestimmt den Zustand eines Objekts. Insbesondere sind auch Referenzvariablen definierbar. Mit Referenzvariablen werden Objekte erzeugt und adressiert. Somit kann auch innerhalb von Klassen auf Objekte zugegriffen werden.

Instanzattribute

Der Inhalt von Instanzattributen bildet den instanzabhängigen Zustand eines Objekts. Instanzattribute werden mit der DATA-Anweisung deklariert.

Statische Attribute

Der Inhalt von statischen Attributen bildet den instanzunabhängigen Zustand der Klasse, der für alle Instanzen gemeinsam gilt. Statische Attribute sind einmal pro Klasse vorhanden. Sie werden mit der Anweisung CLASS-DATA deklariert und bleiben während der gesamten Laufzeit erhalten.

Alle Objekte einer Klasse haben Zugriff auf die statischen Attribute der Klasse. Eine Änderung eines statischen Attributs in einem Objekt ist in allen anderen Objekten der Klasse sichtbar.

Die technischen Eigenschaften von Instanzattributen gehören zu den statischen Eigenschaften einer Klasse. Man kann sich also in einem LIKE-Zusatz über den Klassenkomponentenselektor oder über Referenzvariablen ohne vorherige Erzeugung eines Objekts auf die sichtbaren Attribute einer Klasse beziehen.

Methoden

Methoden sind klasseninterne Prozeduren, die das Verhalten eines Objekts bestimmen. Sie haben Zugriff auf alle Attribute ihrer Klasse und können somit den Zustand eines Objekts verändern. Methoden haben eine Parameterschnittstelle, über die sie beim Aufruf mit Werten versorgt werden und über die sie Werte an den Aufrufer zurückgeben können. Die privaten Attribute einer Klasse können nur durch Methoden der gleichen Klasse geändert werden.

Bezüglich Definition und Parameterübergabe ähneln Methoden den bisherigen Funktionsbausteinen. Eine Methode <meth> wird im Deklarationsteil einer Klasse deklariert und im teil der Klasse durch den Verarbeitungsblock

METHOD <meth>.

...

ENDMETHOD.

implementiert. In Methoden können wie in den anderen ABAP-Prozeduren (Unterprogramme und Funktionsbausteine) lokale Datentypen und Datenobjekte deklariert werden. Methoden werden mit der Anweisung CALL METHOD aufgerufen.

Instanzmethoden

Eine Instanzmethode wird mit der Anweisung METHODS deklariert. Sie hat Zugriff auf alle Attribute einer Klasse und kann alle Ereignisse der Klasse auslösen.

Statische Methoden

Eine statische Methode wird mit der Anweisung CLASS-METHODS deklariert. Sie hat Zugriff auf statische Attribute und darf nur statische Ereignisse auslösen.

Spezielle Methoden

Neben den normalen Methoden, die über CALL METHOD aufgerufen werden, gibt es spezielle Methoden namens CONSTRUCTOR und CLASS_CONSTRUCTOR, die implizit bei der Erzeugung von Objekten oder beim ersten Zugriff auf Klassenkomponenten aufgerufen werden.

Ereignisse

Ereignisse erlauben es einem Objekt oder einer Klasse Ereignisbehandlermethoden in anderen Objekten oder Klassen auszulösen. Während beim normalen Methodenaufruf eine Methode von beliebig vielen Verwendern aufgerufen werden kann, können durch das Auslösen eines Ereignisses beliebig viele Ereignisbehandlermethoden aufgerufen werden. Die Kopplung zwischen Auslöser und Behandler erfolgt zur Laufzeit. Beim normalen Methodenaufruf bestimmt der Aufrufer eindeutig, welche Methode er aufrufen will und die entsprechende Methode muß vorhanden sein. Bei Ereignissen bestimmt der Behandler auf welche Ereignisse er reagieren will und es muß nicht für jedes Ereignis eine Behandlermethode registriert sein.

Die Ereignisse einer Klasse können in den Methoden der gleichen Klasse mit der Anweisung RAISE EVENT ausgelöst werden. Zu einem Ereignis <evt> der Klasse <class> können bei der Methodendeklaration in anderen Klassen oder in der gleichen Klasse mit dem Zusatz FOR EVENT <evt> OF <class> Ereignisbehandlermethoden deklariert werden.

Ereignisse haben eine ähnliche Parameterschnittstelle wie Methoden, jedoch keine Eingabe- sondern nur Ausgabeparameter. Diese Parameter können vom Auslöser (Anweisung RAISE EVENT) an die Ereignisbehandlermethoden übergeben werden, die sie als Eingabeparameter übernehmen.

Die Zuordnung zwischen Auslöser und Behandler erfolgt dynamisch zur Laufzeit eines Programms mit der Anweisung SET HANDLER. Auslöser und Behandler können Objekte und Klassen sein, je nachdem ob es sich um Instanz- oder statische Ereignisse bzw. Ereignisbehandlermethoden handelt. Löst ein Auslöser ein Ereignis aus, werden in allen registrierten Behandlern die entsprechenden Ereignisbehandlermethoden ausgeführt.

Instanzereignisse

Ein Instanzereignis wird mit der Anweisung EVENTS deklariert. Instanzereignisse können nur in Instanzmethoden ausgelöst werden.

Statische Ereignisse

Ein statisches Ereignis wird mit der Anweisung CLASS-EVENTS deklariert. Alle Methoden (Instanz- und statische Methoden) können statische Ereignisse auslösen. Statische Ereignisse sind jedoch die einzigen Ereignisse, die in statischen Methoden ausgelöst werden dürfen.

Siehe auch Ereignisse auslösen und behandeln.

Typen

Mit der TYPES-Anweisung können beliebige selbstdefinierte ABAP-Datentypen innerhalb einer Klasse deklariert werden. Typen sind instanzunabhängig und ein einziges Mal für alle Objekte einer Klasse vorhanden.

Konstanten

Konstanten sind spezielle statische Attribute, deren Werte bei der Deklaration festgelegt werden und nicht änderbar sind. Konstanten werden mit der Anweisung CONSTANTS deklariert. Konstanten sind instanzunabhängig und ein einziges Mal für alle Objekte einer Klasse vorhanden.

Sichtbarkeitsbereiche

Der Deklarationsteil einer Klasse kann in bis zu drei verschiedene Sichtbarkeitsbereiche unterteilt werden:

CLASS <class> DEFINITION.
  PUBLIC SECTION.
...
  PROTECTED SECTION.
...
  PRIVATE SECTION.
...
ENDCLASS.

Diese Bereiche definieren die Sichtbarkeit der Klassenkomponenten von außen und somit die Schnittstellen der Klasse für ihre Verwender. Jede Komponente einer Klasse muß explizit einem der Sichtbarkeitsbereiche zugeordnet werden.

Public Section

Alle im öffentlichen Abschnitt deklarierten Komponenten sind für alle Verwender sowie in den Methoden aller Erben und der Klasse selbst ansprechbar. Die öffentlichen Komponenten stellen die Schnittstelle der Klasse zu jedem Verwender dar.

Protected Section

Alle im geschützten Abschnitt deklarierten Komponenten sind in den Methoden aller Erben und der Klasse selbst ansprechbar. Die geschützten Komponenten stellen eine spezielle Schnittstelle der Klasse für ihre Unterklassen dar. Da zu Release 4.5A die Vererbung noch nicht aktiv ist, wirkt der geschützte Abschnitt zur Zeit wie der private Abschnitt.

Private Section

Alle im privaten Abschnitt deklarierten Komponenten sind nur in den Methoden der Klasse selbst ansprechbar und auch nicht für die Erben sichtbar. Die privaten Komponenten stellen somit keine Schnittstelle zu den Verwendern der Klasse dar.

Kapselung

Die drei Sichtbarkeitsbereiche sind Grundlage für die wichtige Objekteigenschaft der Kapselung in ABAP Objects. Bei der Definition einer Klasse sollte darauf geachtet werden, so wenig Komponenten wie möglich im öffentlichen Abschnitt zu deklarieren und diese öffentlichen Komponenten sorgfältig zu entwerfen. Für globale Klassen dürfen sie nach einer Freigabe der Klasse nicht mehr geändert werden.

Beispielsweise sind öffentliche Attribute natürlich von außen sichtbar und somit ein Teil der Schnittstelle zwischen Objekten und deren Verwender. Wenn man den Zustand eines Objekts vollständig kapseln will, dürfen also keine öffentlichen Attribute deklariert werden. Zusätzlich zur Sichtbarkeit kann die Änderbarkeit von Attributen aber auch mit dem Zusatz READ-ONLY bei der Deklaration eingeschränkt werden.

Klassen mit nicht-öffentlicher Instanziierung

Mit der Anweisung

CLASS <class> DEFINITON CREATE PROTECTED|PRIVATE.

kann dafür gesorgt werden, daß Objekte der Klasse <class> nur in der Klasse selbst bzw. in ihren Unterklassen erzeugt werden können. Dies ermöglicht eine eindeutige Instanzenverwaltung.

 

Siehe auch:

Übersichtsgrafik

Beispiel

 

 

Ende des Inhaltsbereichs