2016-04-05 7 views
1

Ich denke, wir können immer Klasse mit mehreren Schnittstellen zB ersetzen:Stimmt es, dass wir alle Klassen ersetzen können, die mehrere Schnittstellen implementieren?

public class C implements A,B{ 
} 

in einer anderen Version, die jede Klasse höchstens eine Schnittstelle enthält, ist es wahr (ich will nur fragen: „Wenn wir können ...“ nicht "Wenn wir ..." hier sollten)?

C betrachten, die Methoden a() von einem überschreibt, und b() B:

public class C implements A,B{ 
    @override 
    public void a(){ 
    } 

    @override 
    public void b(){ 
    } 
} 

wird volating einzige Verantwortung Prinzip, weil entweder ändern, um ein() oder b() erfordert C Änderung, sondern wir kann A und B mit einer unabhängigen Klasse umhüllen:

public class ConcreteA implements A{ 
    @override 
    public void a(){ 
    } 
} 

public class ConcreteB implement B{ 
    @override 
    public void b(){ 
    } 
} 

public class C{ 
    ConcreteA a; 
    ConcreteB b; 
} 

ist es wahr?

Und auch Ihre Klasse eine einzige Verantwortung hat, die 2-Schnittstelle erfordert, ist es immer noch möglich, es neu zu schreiben, in jeder Klasse nur eine Schnittstelle zu werden, zum Beispiel der Originalversion:

public class C implements A,B{ 
    @Override 
    public void a(){ 
    } 

    @Override 
    public void b(){ 
     a(); 
    } 
} 

wir in diesem Fall kann es umschreiben als:

public class ConcreteA implements A{ 
    @Override 
    public void a(){ 
    } 
} 

public class C implements B{ 
    ConcreteA a; 
    @Override 
    public void b(){ 
     a.a(); 
    } 
} 

so ist meine Frage, es ist wahr, dass wir alle unsere Klassen ersetzen können, die mehr als zwei Schnittstellen in die Version enthalten, die nur höchstens eine Schnittstelle enthält?

Wenn nicht, in welchen Situationen muss ich mehr als eine Schnittstelle implementieren, um die Aufgabe zu beenden?

+3

Nein, das stimmt nicht. Was ist, wenn eine der Schnittstellen 'Serializable' ist? –

+0

Übrigens meinen Sie anhand Ihrer Beispiele "mindestens 2" ('> = 2'), nicht" mehr als 2 "('> 2'). –

+0

Meinst du: öffentliche Klasse C erweitert ConcreteA implementiert B oder wenn B definiert ist, implementiert es auch A in der Definition? damit beide Methoden a() und b() auf Instanzen der C-Klasse zugänglich sind? –

Antwort

0

Die Frage, ob die Implementierung mehrerer Schnittstellen oder die Verwendung der Mehrfachvererbung im Allgemeinen das Prinzip der einheitlichen Verantwortlichkeit verletzt, wurde bereits diskutiert, zum Beispiel here. Es scheint keinen klaren Konsens darüber zu geben. Meiner Meinung nach ist die Definition von SRP zu streng.

Die in den Kommentaren erwähnte Schnittstelle Serializable ist ein Sonderfall, da es sich um eine Markierungsschnittstelle handelt, die keine Methoden deklariert. Aber es gibt andere Schnittstellen wie Runnable, die normalerweise keinen Sinn ergeben, um alleine verwendet zu werden.

Zurück zu Ihrer Frage: Ja, in der Theorie ist es möglich, aber nicht ohne andere wichtige Prinzipien wie DRY zu brechen (wiederholen Sie nicht). Man denke nur an einer Klasse, die nicht nur implementiert Methoden in den implementierten Schnittstellen deklariert, sondern auch seine eigene Methode:

public class C implements A,B { 
    public void a(){} 
    public void b(){} 
    public void c(){} 
} 

Splitting Ergebnisse in:

public class CA implements A { 
    public void a(){} 
    public void c(){} 
} 

public class CB implements B { 
    public void b(){} 
    public void c(){} 
} 

Jetzt Methode c() dupliziert. Ja, Sie könnten eine zusätzliche Schnittstelle verwenden C oder diese Methode in eine Art Utility-Klasse einfügen, aber ich würde sagen, dass dies in der Regel nicht das Design verbessern wird.