Ansicht
Dokumentation

ABENCLASS_COMPONENTS_ADDRESSING - CLASS COMPONENTS ADDRESSING

ABENCLASS_COMPONENTS_ADDRESSING - CLASS COMPONENTS ADDRESSING

General Material Data   RFUMSV00 - Advance Return for Tax on Sales/Purchases  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

- Zugriff auf die Komponenten von Klassen

Beim Zugriff auf die Komponenten von Klassen ist zwischen dem Zugriff von innerhalb und dem Zugriff von außerhalb der gleichen Klasse zu unterscheiden. Beim Zugriff von innen, also innerhalb einer Methode der gleichen Klasse, genügt der Name der Komponente. Beim Zugriff von außen müssen bei Instanzkomponenten das Objekt und bei statischen Komponenten die Klasse mit einem Objektkomponenten- bzw. Klassenkomponenten-Selektor angegeben werden. Man unterscheidet dabei zwischen statischen und dynamischen Varianten.

Beim statischen Zugriff kann mit Objektreferenzvariablen nur auf die Komponenten zugegriffen werden, die der Referenzvariablen bekannt sind. Dies sind genau die Komponenten, die im statischen Typ der Referenzvariable (Klasse oder Interface) vorhanden sind. Klassenreferenzvariablen, die mit Bezug auf eine Oberklasse typisiert sind aber auf Unterklassen zeigen, kennen nur die Komponenten der Oberklasse und Interfacereferenzvariablen kennen nur Interfacekomponenten.

Beim dynamischen Zugriff wird bei Klassenreferenzvariablen der dynamische Typ zur Bestimmung der Komponente verwendet. Das ist der Typ des Objekts auf welches die Referenz verweist und nicht der Typ, mit welchem die Referenz typisiert wurde. Bei Interfacereferenzvariablen wird auch beim dynamischen Zugriff der statische Typ verwendet, also der Typ mit welchem die Referenz typisiert wurde.

Beim dynamischen Zugriff kann also mit Referenzvariablen, die mit Bezug auf eine Oberklasse typisiert sind und auf Unterklassen zeigen, auf jede Komponente der Unterklasse zugegriffen werden, für die ein dynamischer Zugriff vorgesehen ist. Insbesondere kann dynamisch also auch mit Referenzvariablen vom Typ REF TO OBJECT auf Komponenten zugegriffen werden. Der dynamische Zugriff erlaubt es aber nicht, mit einer Interfacereferenzvariablen auf klasseneigene Komponenten zuzugreifen, sondern nur auf die entsprechenden Interfacekomponenten. Ein Zugriff auf klasseneigene Komponenten mit Interfacereferenzvariablen ist nicht möglich, da beim Zugriff mit Interfacereferenzvariablen implizit immer das Präfix intf~ verwendet wird.

Statischer Zugriff

Es gilt folgende Syntax (oref ist eine Objektreferenzvariable):

  • Zugriff auf ein Instanzattribut attr: oref->attr
  • Aufruf einer Instanzmethode meth: oref->meth( ... )

Auf statische Komponenten kann außer über Referenzvariablen auch über den Klassennamen zugegriffen werden:

  • Zugriff auf ein statisches Attribut attr: class=>attr
  • Aufruf einer statischen Methode meth: class=>meth( ... )

In diesem Zusammenhang ist zu bemerken, dass sich die Eigenschaften von Instanzattributen wie statische Komponenten verhalten. Man kann sich also in einem LIKE-Zusatz über den Klassenkomponenten-Selektor oder über Referenzvariablen ohne vorherige Erzeugung eines Objekts auf die sichtbaren Attribute einer Klasse beziehen.

Innerhalb einer Klasse kann außer über direkte Angabe des Namens auch mit der Selbstreferenz me auf die eigenen Komponenten zugegriffen werden:

  • Zugriff auf ein eigenes Attribut attr innerhalb der Klasse: me->attr
  • Aufruf einer eigenen Methode meth innerhalb derselben Klasse: me->meth( ... )
Die Selbstreferenz ermöglicht es einem Objekt, anderen Objekten eine Referenz auf sich selbst zu übergeben. Weiterhin kann innerhalb eines Objekts in Methoden auf Attribute zugegriffen werden, die von lokalen Attributen der Methode verschattet werden.

Innerhalb einer redefinierten Methode einer Unterklasse kann mit der Pseudoreferenz super auf die verschattete Methode in einer der Oberklassen zugegriffen werden:

  • Aufruf einer verschatteten Methode meth: super->meth( ... )
Innerhalb des Instanzkonstruktors einer Unterklasse muss mit der Pseudoreferenz super der Instanzkonstruktor der direkten Oberklasse aufgerufen werden:
  • Aufruf des Konstruktors der direkten Oberklasse:
super->constructor( ... )

Als spezielle Methode des Zugriffs auf Attribute gibt es die Möglichkeit, Attribute für Schlüsselzugriffe auf interne Tabellen zu verwenden, falls diese Referenzvariablen enthalten.

Dynamischer Zugriff

Der dynamische Zugriff auf Komponenten von Klassen ist für Attribute (Dynamic Access) und für Methodenaufrufe (Dynamic Invoke) möglich.

Dynamischer Zugriff auf Attribute

Der dynamische Zugriff auf Attribute ist über dynamische ASSIGN-Anweisungen an Feldsymbole möglich.

Es können folgende Varianten verwendet werden (oref ist eine Objektreferenzvariable):

  • Völlig dynamische Angabe:
ASSIGN (f) TO <fs>.
  • Teilweise dynamische Angabe für Instanzattribute:
ASSIGN oref->(f) TO <fs>.
  • Teilweise dynamische Angabe für statische Attribute:
ASSIGN (f1)=>(f2) TO <fs>.

Die Inhalte der Felder f, f1 und f2 werden als Bezeichner von Attributen interpretiert. Im völlig dynamischen Fall kann f beispielsweise den Inhalt 'oref->attr' haben. Bei der teilweisen dynamischen Angabe für Instanzattribute wird in f nur das Attribut bezeichnet (das natürlich selbst wieder ein Zeiger auf ein anderes Attribut sein kann). f1 und f2 können Klassennamen und statische Attribute sein.

Dynamische Methodenaufrufe

Es gilt folgende Syntax (oref ist eine Objektreferenzvariable):

  • Aufruf einer Instanzmethode meth:
CALL METHOD oref->(f)
  • Aufruf einer statischen Methode meth:
CALL METHOD class=>(f)
CALL METHOD (c)=>meth
CALL METHOD (c)=>(f)
  • Aufruf einer Methode meth innerhalb derselben Klasse:
CALL METHOD (f)
CALL METHOD me->(f)

Dabei sind f und c Felder, die den Namen der Methode meth bzw. der Klasse class enthalten.

Beim dynamischen Methodenaufruf ist es wie auch beim Aufruf von Funktionsbausteinen möglich, die Aktualparameter dynamisch in speziellen internen Tabellen zu übergeben.






CL_GUI_FRONTEND_SERVICES - Frontend Services   ABAP Short Reference  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 8004 Date: 20240606 Time: 094215     sap01-206 ( 121 ms )