2017-03-01 5 views
0

Angenommen, ich habe eine Schnittstelle wie folgt definiert:Implementierung mehrerer paralleler Schnittstelle

public interface TestInterface1 { 
    public void add(); 
} 

, die durch die Klassen A, B und C durchgeführt wird

Jetzt brauche ich nur eine subtrahieren Funktionalität hinzuzufügen zu Klasse C; Dafür habe ich eine neue Schnittstelle TestInterface2 und implementiert, dass die Klasse C:

public interface TestInterface2 { 
    public void sub(); 
} 

Klasse C wie folgt aussieht:

public class C implements TestInterface1, TestInterface2 { 
    public void add() { 
     System.out.println("I am in add"); 
    } 

    public void sub() { 
     System.out.println("I am in Sub"); 
    } 
} 

Nun das Problem ist Instanzen von C Verwendung hat die Orte in Hunderten dies wie:

TestInterface1 c = new C(); 

Und nur Klasse C ist die Add-Methode von TestInterface1 bekommen.

Gibt es eine Möglichkeit oder ein Muster, um beide Schnittstellen in Klasse C zu implementieren, so dass wo immer das Objekt der Klasse C erstellt wird, beide Methoden von TestInterface1 und TestInterface2?

+0

Wenn es 'java 8' dann können Sie mit' default methods' – Nilesh

+0

sonst eine Schnittstelle von einem anderen erweitern und dann kann es sein, done.Hope macht es Sinn – Nilesh

+4

'C c = new C();' ? –

Antwort

0

Bevor wir damit anfangen, müssen Sie überlegen, warum Sie überhaupt überhaupt Schnittstellen dafür verwenden. Eine Schnittstelle garantiert, dass alle Instanzen die gleichen Implementierungen verwenden. Wenn Sie möchten, dass eine bestimmte Klasse eine spezifischere Implementierung hat, dann hört sich das mehr nach einer Methode für die konkrete Klasse als nach einer neuen Schnittstelle an.

Unabhängig davon können wir Ihre Optionen diskutieren. Einer von ihnen ist sauberer und vermittelt klare Absichten; die anderen schmutzigen Dinge.

Die erste Option - die eine klarere Absicht vermittelt - besteht darin, die Verwendung der restriktiveren Schnittstelle zu vermeiden und stattdessen TestInterface2 für jede Deklaration zu verwenden, die Sie verwenden möchten C.

Das heißt, Sie würden TestInterface2 c = new C(); überall dort schreiben, wo Sie es verwenden wollten. Ja, man würde es in allen Orten werden zu ändern, die Sie C verwenden, aber wenn man bedenkt, dass Sie eine Methode, um Instanzen von C speziell angebracht haben haben, ist diese Option klarsten.

Dies wäre der gleiche Ansatz, wenn Sie nur die Methode in C geschrieben haben. Es gibt wirklich keinen Unterschied zwischen den beiden, und ich persönlich würde es vorziehen, wenn Sie die Methode geschrieben, die nur-C in C gehörte.

Die zweite Option - die Dinge trübt und auch erfordert Java 8 - ist eine Standard-Methode zu verwenden. Diese erfordert, dass Sie es auf den ersten ...

public interface TestInterface { 
    default void sub() { 
     System.out.println("I am in sub!"); 
    } 
} 

in der Schnittstelle implementieren ... aber Sie können es in Ihrer Klasse überschreiben später. Dies trübt Dinge, weil jede Klasse, die TestInterface implementiert Zugriff auf diese Standardmethode hat, was nicht wahrscheinlich ist, was Sie für Ihre Anforderungen möchten.

1

Wenn Sie Ihre Schnittstellen ändern können dann machen TestInterface1 die andere erstrecken, so erstellte Objekt erste Schnittstelle kann die übergeordneten Methoden.

public interface TestInterface1 extends TestInterface2{ 
    public void add(); 
} 
Verwandte Themen