Home > Informatik > Begriffe und Konzepte > Downcast

Downcast

Definition

Downcast

Ein Objekt einer Oberklasse o = new O() kann auch einer Variablen u einer Unterklasse von O zugewiesen werden. Dazu muss o aber explizit in den Typ der Unterklasse konvertiert werden. Diesen Prozess bezeichnet man als Downcasting

Erläuterungen

Dieses Quelltext-Beispiel stammt aus dem Buch von Lahres et. al [1]. Eine Oberklasse Geschaeftspartner besitzt zwei Unterklassen:Person und Organisation.

Die Klasse Person hat u.a. die beiden Instanzvariablen vorname und nachname, während die Klasse Organisation die Instanzvariable bezeichnung besitzt.

In einer weiteren Klasse GeschaeftspartnerAnzeige soll nun eine Methode

public String anrede(Geschaeftspartner p)

implementiert werden.

public class GeschaeftspartnerAnzeige
{
    // ...
	 
    public String anrede(Geschaeftspartner p)
    {
       if (p instanceof Person)
           return ((Person) p).vorname() + " " + 
			         ((Person) p).nachname();
       else if (p instanceof Organisation)
          return ((Organisation) p).bezeichnung();
       else 
          return "Unbekannter Geschäftspartner-Typ";
     }
    // ---
}

Mit dem Operator instanceof lässt sich zur Laufzeit überprüfen, ob ein Objekt einer bestimmten Klasse oder deren Unterklasse angehört.

Trifft dies zu, kann mit Typecasting (hier: (Person) p bzw. (Organisation) p) der Typ des Objekts für den Zugriff auf die spezifischen Methoden oder Attribute der Unterklasse angepasst werden.

Durch (Person) p wird kein neues Objekt erzeugt, sondern lediglich eine Typumwandlung vorgenommen. Nach dieser Typumwandlung (Typecast) kann direkt auf die Instanzvariablen oder Methoden der Zielklasse zugegriffen werden.

Hier das Ganze noch einmal im Einzelnen

Handelt es sich bei dem Geschäftspartner p um ein Objekt der Klasse Person, dann findet ein Typecasting (Person) p statt, p wird also in ein Objekt der Klasse Person umgewandelt. Daher kann mit p.vorname und p.nachname direkt auf die Instanzvariablen des Person-Objektes zugegriffen werden. Wenn die Klasse Person Methoden zur Verfügung stellt, könnte ebenso auf diese Methoden zugegriffen werden.

Handelt es sich bei dem Geschäftspartner p jedoch um ein Objekt der Klasse Organisation, so wird p durch (Organisation) p in ein Objekt der Klasse Organisation umgewandelt, so dass auf die Instanzvariable bezeichnung zugegriffen werden kann.

In diesem Beispiel wird ein klassisches Downcasting verwendet, um aus einer Oberklassen-Referenz (Geschaeftspartner) eine Unterklassen-Referenz (Person oder Organisation) zu erzeugen, so dass dann auf die spezifischen Eigenschaften der Unterklasse zugegriffen werden kann.

Merke:

Downcasting

  • Mit instanceof wird geprüft, ob ein Objekt einer bestimmten Klasse oder Unterklasse angehört.
  • Ergibt der Test true, kann man mit Downcasting ((Unterklasse) objekt) auf die spezifischen Instanzvariablen oder Methoden der Unterklasse zugreifen.
  • Das Casting erzeugt kein neues Objekt, sondern ändert nur den Typ der Referenz.

Downcasting vermeiden!

Ein guter Programmierstil ist die häufige Verwendung solcher Downcasts nicht, wie Lahres in seinem Buch sagt. Das oben gezeigte Beispiel aus diesem Buch verletzt nämlich das Prinzip der Ersetzbarkeit:

"Das Prinzip der Ersetzbarkeit besagt, dass jedes Exemplar einer Klasse deren Spezifikation erfüllen muss. Das gilt auch dann, wenn das Objekt ein Exemplar einer Unterklasse der spezifizierten Klasse ist." [1]

Die Unterklasse Person kann hier aber die Oberklasse Geschaeftspartner nicht einfach ersetzen, wie es das Prinzip vorschreibt. Damit die korrekte Anrede des Geschäftspartners ausgegeben werden kann, muss ein Geschaeftspartner-Objekt erst durch Downcasting in eine Person-Objekt konvertiert werden.

Quellen:

  1. Lahres et al.: Objektorientierte Programmierung, Rheinwerk Computing 2021.
  2. Barnes, Kölling: Java lernen mit BlueJ - Objects first. Pearson-Verlag 2019.
  3. Ullenboom: Java ist auch eine Insel, Rheinwerk Computing 2023.