2016-08-07 34 views
4

Für ein Projekt, ich habe folgende Klassen:Wie vermeidet man Mehrfachvererbung?

  • Oberklasse
  • Subclass 1
  • Subclass 2

Die beiden Unterklassen der Oberklasse erweitern. Jetzt brauche ich eine dritte Klasse mit dem EXACT-Verhalten (lesen, gleiche überschreiben Methodenimplementierungen) von Sub-Klasse 1 und Subklasse 2. Weil Unterklasse 1 nur 1 Methode in SuperClass überschreibt, und Subklasse 2 überschreibt diese Methode, I nicht möchte die dritte Klasse Superklasse erben lassen und sie einfach mit den Methoden der Unterklasse 1 und Unterklasse 2 implementieren. Nun, ist das ein gutes OO-Design? Ich sehe keine andere Lösung, weil Mehrfachvererbung in Java einfach nicht möglich ist. Gibt es Alternativen?

+4

Favor Komposition der Vererbung ... – vlaz

+3

würde es nützlich sein, die Klassendefinitionen zu sehen und wie Sie sie verwenden, zu sagen, ob es ein gutes Design ist –

Antwort

8

Java8 eingeführt Standard und statische Methoden für Schnittstellen. Bis zu einem gewissen Grad ermöglicht dies eine mehrfache Vererbung. Aber am wahrscheinlichsten wäre die richtige Lösung, Ihr Design zu überarbeiten.

Sie sehen, Vererbung ist nicht über Code-Wiederverwendung. Es geht darum, nützliche Abstraktionen zu schaffen; und zum Beispiel Polymorphismus gut nutzen.

In Ihrem Fall: Vielleicht könnten/sollten diese Funktionalitäten in kleinere Schnittstellen eingefügt werden; und dann getrennt in ihre eigenen, unabhängigen Klassen. Und dann verwenden Sie Zusammensetzung von Objekten anstelle von Vererbung, um das Ding zu bauen, das Sie brauchen.

3

Hier ist ein Beispiel, das die Standardmethoden von Java 8 als @GhostCat verwendet. Ich sehe nichts falsch mit diesem OO-Design an sich. Ob es für Ihren Anwendungsfall geeignet ist oder nicht, hängt von den Details des Problems ab, das Sie lösen.

public class Main { 

    public static void main(String... args) { 
     SuperClass sc = new SubClass3(); 
     sc.foo(); // overridden foo 
     sc.bar(); // overridden bar 
    } 

    interface SuperClass { 
     default void foo() { 
      System.out.println("default foo"); 
     } 
     default void bar() { 
      System.out.println("default bar"); 
     } 
    } 

    interface SubClass1 extends SuperClass { 
     @Override 
     default void foo() { 
      System.out.println("overridden foo"); 
     } 
    } 

    interface SubClass2 extends SuperClass { 
     @Override 
     default void bar() { 
      System.out.println("overridden bar"); 
     } 
    } 

    static class SubClass3 implements SubClass1, SubClass2 {} 
} 
Verwandte Themen