[Beispiel] Mehrfachvererbung in Java 8

i3810jaz

Freizeitschrauber(in)
Mit Java in der Version 8 ist es nun endlich möglich Mehrfachvererbung zu nutzen. Hierzu werden Interfaces genutzt, denen man eine Standard-Implementierung mitgibt.
Eine Besonderheit bei der Vererbung mit Interfaces ist, das Codeänderungen rückwirkend passieren. Das bedeutet wenn man einen Menschen hat, der von einem Affen erbt und diese nun verschiedene "essen()"-Methoden haben, aber nur der Affe eine "doTagesablauf()"-Methode (in welcher dann auch die "essen()"-Methode aufgerufen wird). So wird nun beim Menschen beim Ausführen von "doTagesablauf()" ,die "essen()"-Methode des Menschen und nicht wie normal die des Affen aufrufen.

Code-Beispiel:
Chicken.java:
Code:
public interface Chicken {
    default public void fly(){
        System.out.println("Das Hühnchen landet im Dreck!");
    }
    
}
Cow.java
Code:
public interface Cow {
    default public void bla(){
    giveMilk();
    }
    
    default public void giveMilk(){
    System.out.println("Die Kuh gab dir etwas Milch");
    }
    
}

Von diesen beiden Klassen erbt nun das Monster ;)
Monster.java
Code:
public interface Monster extends Cow, Chicken {
    default public void giveMilk(){
        System.out.println("Diese Milch sollte man lieber nicht mehr trinken, schütte sie weg!");
    } 
}

Nun wird zum Beispiel diese Programm-Routine,
Mehrfachvererbung.java
Code:
public class MehrfachVererbung {

    public static void main(String[] args) {
        Monster m = new Monster() {};
        m.bla();
        m.fly();
    }  
}

diesen Output erzeugen,
Code:
Diese Milch sollte man lieber nicht mehr trinken, schütte sie weg!
Das Hühnchen landet im Dreck!
da das Erben mit Interfaces ein bisschen anders funktioniert.


P.S.: Ich hoffe, dass ich keine Fehler eingebaut habe, wenn doch korrigiert mich bitte. :)
 
Zuletzt bearbeitet:
Ehrlich gesagt bin ich nicht unbedingt ein Freund der Mehrfachvererbung ("Diamond of Death"; kann "missbraucht" werden). Was aber nicht heißen soll, dass das kein nützliches Werkzeug sein kann. Für mich interessanter ist allerdings, dass man mit den default Implementierungen wunderbar ein bestehendes Interface erweitern kann, ohne alle Implementierungen anpassen zu müssen (außer natürlich man baut sich damit gerade das Diamond-Problem zusammen). Iterable.forEach() ist ein Beispiel für solch eine Erweiterung.
 
Ich weis nicht inwiefern das Diamond-Problem in anderen Programmiersprachen eine Sackgasse ist, in Java lässt sich die fragliche Methode aber in der erbenden Klasse überschreiben. Dann nennt man die benachteiligte Methode eben anders. Super-Zugriffe auf die vererbenden Klassen funktionieren ja. (vererbendeKlasse.super.fraglicheMethode()).
 
Ja, das Problem lässt sich so lösen, das meine ich auch gar nicht. Ich kenne das Problem halt von C++ (funktioniert da anders) und irgendwie meide ich den Kram lieber so gut es geht. Bin bis jetzt ganz gut damit ausgekommen, zumal Java das früher auch einfach nicht unterstützt hat und man sich somit eh was anderes überlegen musste. Wie gesagt, die defender Methoden sind trotzdem eine coole Sache.
 
Zurück