Default-Methoden aus speziellen Oberschnittstellen ansprechen

Eine Unterklasse kann eine konkrete Methode der Oberklasse überschreiben, aber dennoch auf die Implementierung der überschriebenen Methode zugreifen. Allerdings muss der Aufruf über super erfolgen, da sich sonst ein Methodenaufruf rekursiv verfängt.

Default-Methoden können andere Default-Methoden aus Oberschnittstellen ebenfalls überschreiben und mit neuem Verhalten implementieren. Doch genauso wie normale Methoden können sie mit super auf Default-Verhalten aus dem übergeordneten Typ zurückgreifen.

Nehmen wir für ein Beispiel wieder zwei erweiterte Schnittstelle Prices und Buyable an:

interface Priced {

double price();

default boolean hasPrice() { return price() > 0; }

}

interface Buyable extends Priced {

@Override double price();

@Override default boolean hasPrice() { return Priced.super.hasPrice() || price() == 0; }

}

In der Schnittstelle Priced sagt der Default-Code von hasPrice() aus, dass alles einen Preis hat, was echt über 0 liegt. Buyable dagegen nutzt eine andere Definition und implementiert daher das Default-Verhalten neu. Denn Buyable definiert hasPrice() so, dass auch ein Preis von 0 letztendlich bedeutet, dass es einen Preis hat. In der Implementierung von hasPrice() greift Buyable auf den Default-Code von Priced zurück, um vom Obertyp eine Entscheidung über die Preiseigenschaft zu bekommen, die aber mit der Oder-Verknüpfung noch verallgemeinert wird.

Über Christian Ullenboom

Ich bin Christian Ullenboom und Autor der Bücher ›Java ist auch eine Insel. Einführung, Ausbildung, Praxis‹ und ›Java SE 8 Standard-Bibliothek. Das Handbuch für Java-Entwickler‹. Seit 1997 berate ich Unternehmen im Einsatz von Java. Sun ernannte mich 2005 zum ›Java-Champion‹.

2 Gedanken zu „Default-Methoden aus speziellen Oberschnittstellen ansprechen

  1. Obwohl ich zwar deine Artikel SEHR, SEHR schätze, die Übersetzung aller möglichen Ausdrücke auf Deutsch nervt manchmal ziemlich. „Oberschnittstellen“???

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.