= (Up Cast) ?= (Down CAST)

Down Cast:

do ?= so

Der Downcast ist gefährlich, wenn das Zielobjekt (aus der Unterklasse) mit Methoden und Attributen abgefragt wird, die das Zielobjekt zwar nun besitzt, aber das Quellobjekt (aus der Oberklasse) nicht besessen hat.

Beim Casting (Narrawing Cast) ist der statische Typ der Zielvariablen spezieller als der statische Typ der Quellvariablen. Eine Zuweisung ist nur mit dem Casting-Operator „?=“ möglich und nicht mit „=“. Das reine „=“ würde zu einem Syntaxfehler führen.

Beim Upcasting wird die Unterklasse der Oberklasse zugewiesen.

Beim Downcasting wird die Oberklasse der Unterklasse zugewiesen.

ABAP-Schlüsselwortdokumentation

=, ?= – Up Cast und Down Cast

Syntax

destination_ref =|?= source_ref.

Wirkung

Zuweisung zwischen zwei Referenzvariablen. Die in source_ref enthaltene Referenz wird destination_ref zugewiesen. Nach erfolgreicher Zuweisung zeigt destination_ref auf das gleiche Objekt wie source_ref (Referenzsemantik). Die Zuweisung von Referenzvariablen ist eine spezielle Form der Zuweisung von Datenobjekten, wobei für die Zuweisung zwischen Referenzvariablen zwei Zuweisungsoperatoren zur Verfügung stehen, deren Verwendung sich nach den Zuweisungsregeln für Referenzvariablen richtet:

  • Der allgemeine Zuweisungsoperator = kann bei einer Zuweisung zwischen Referenzvariablen nur für einen Up Cast verwendet werden, bei dem der statische Typ von source_ref spezieller oder gleich dem statischen Typ von destination_ref ist.

  • Der spezielle Casting-Operator ?= kann nur für Zuweisungen zwischen Referenzvariablen verwendet werden. Wenn der statische Typ von source_ref allgemeiner als der statische Typ von destination_ref ist, muss ?= verwendet werden, um einen Down Cast zu bewirken. Dies wird falls statisch erkennbar von der Syntaxprüfung und ansonsten zur Laufzeit überprüft. Der eigentliche Down Cast, d.h. die Überprüfung, ob eine Zuweisung nach den Zuweisungsregeln für Referenzvariablen möglich ist, findet immer erst zur Laufzeit statt. Wenn der statische Typ von destination_ref dann nicht allgemeiner oder gleich dem dynamischen Typ von source_ref ist, kommt es zu einer behandelbaren Ausnahme und die Zielvariable behält ihren ursprünglichen Wert.

Für die rechte und linke Seite gilt das Gleiche wie bei der Zuweisung von Datenobjekten, mit folgenden Einschränkungen:

Hinweise

  • Der Casting-Operator ?= kann immer, also auch für Up Casts, angegeben werden. Dies ist in aller Regel aber nicht notwendig.

  • Wenn statisch erkennbar ist, dass eine Zuweisung prinzipiell nicht möglich ist, kann weder = noch ?= verwendet werden. Dies ist beispielsweise der Fall, wenn die statischen Typen von Quell- und Zielvariable Klassen aus unterschiedlichen Pfaden des Vererbungsbaums sind.

  • Die Null-Referenz einer initialen Referenzvariable kann bei einem Down Cast jeder Zielvariable zugewiesen werden, die dort angegeben werden kann.

  • Neben ?= gibt es einen weiteren Casting-Operator CAST, der Down Casts an Operandenpositionen ermöglicht und damit hilft, Hilfsvariablen einzusparen.

  • Der Casting-Operator ?= kann nicht in Mehrfachzuweisungen verwendet werden.

  • Eine obsolete Form des Down Casts ist die Anweisung MOVE mit dem Zusatz ?TO.

Beispiel

Die ersten beiden Zuweisungen des folgenden Quelltextabschnitts sind Up Casts:

  • Der Instanzierungsoperator NEW erzeugt ein Resultat vom statischen und dynamischen Typ c2, welcher der allgemeineren Referenzvariable oref1 zugewiesen werden kann.

  • An die Referenzvariable oref vom allgemeinsten statischen Typ object kann jede Referenzvariable zugewiesen werden.

Die nächsten beiden Zuweisungen sind Down Casts:

  • Es kann erst zur Laufzeit überprüft werden, ob die allgemeine Referenzvariable oref auf ein Objekt zeigt, auf das auch oref2 zeigen darf. Dies ist im Beispiel der Fall.

  • Der Down Cast von oref2 nach oref3 schlägt dagegen zur Laufzeit fehl und erzeugt die abgefangene Ausnahme.

CLASS c1 DEFINITION INHERITING FROM object.
ENDCLASS.

CLASS c2 DEFINITION INHERITING FROM c1.
ENDCLASS.

CLASS c3 DEFINITION INHERITING FROM c2.
ENDCLASS.

DATA oref  TYPE REF TO object.
DATA oref1 TYPE REF TO c1.
DATA oref2 TYPE REF TO c2.
DATA oref3 TYPE REF TO c3.

oref1 = NEW c2( ).

oref = oref1.

TRY.
    oref2 ?= oref.
  CATCH cx_sy_move_cast_error.
    …
ENDTRY.

TRY.
    oref3 ?= oref2.
  CATCH cx_sy_move_cast_error.
    …
ENDTRY.

Ausnahmen

Behandelbare Ausnahmen

CX_SY_MOVE_CAST_ERROR

  • Ursache: Typkonflikt beim Down Cast
    Laufzeitfehler: MOVE_CAST_ERROR

  • Ursache: Quell- oder Zielvariable sind keine Referenzvariable
    Laufzeitfehler: MOVE_CAST_REF_ONLY

  • Ursache: Dynamischer Typkonflikt bei Zuweisung von Referenzen
    Laufzeitfehler: MOVE_CAST_ERROR_DYN

Hier die Werte und Typen der Variablen oref1 und oref.

oref ist von Type object und oref1 von Type c1, aber beide haben den Wert bzw. sind Referenzen auf ein Objekt von Type c2. (Upcast).

oref3 ist von statischen Type c3, oref1 von statischen Type c1 und Referenz auf Objekt von type c2. (Downcast wo Ausnahme auftritt)

oref3