2016-04-05 47 views
1

私たちは常に、例えば、複数のインターフェイスを持つクラスを置き換えることができると思います。各クラスは多くても1つのインターフェイスに含まれている別のバージョンに複数のインターフェイスを実装するすべてのクラスを置き換えることは可能ですか?

public class C implements A,B{ 
} 

、それは(私は聞きたい真実である「私たちができれば...」 、 "もし私たちがすべきなら...")ではなく?

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

    @override 
    public void b(){ 
    } 
} 

がvolatingれる単一責任原理ためのいずれか、変更Cが必要)((a)またはbを変更する代わりに、我々:

()は、AからメソッドをオーバーライドC、及びB()Bを検討しますAとBを独立したクラスでラップすることができます:

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; 
} 

本当ですか?この場合

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

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

我々は:

とも、あなたのクラスが2インタフェースを必要と単一責任を持って、それだけで、各クラス内の1つのインタフェースになるために、それを書き換えることは可能である、例えば、オリジナル版それを書き換えることができます:

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

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

だから私の質問は、それは我々が多くても1つのインタフェースのみを含むバージョンに2つの以上のインターフェイスが含まれている私たちのクラスのすべてを置き換えることができるというのは本当ですか?

もしそうでなければ、どのような状況でタスクを完了するために複数のインターフェースを実装する必要がありますか?

+3

いいえ、そうではありません。いずれかのインタフェースが 'Serializable'の場合はどうなりますか? –

+0

ところで、あなたの例に基づいて、「2以上」( '> 2')ではなく「少なくとも2」( '> = 2')を意味します。 –

+0

'public class C extends ConcreteAはBを実装しているのですか?Bが定義されている場合、定義にAも実装されていますか?メソッドa()とb()の両方がCクラスのインスタンスからアクセスできるようにしますか? –

答えて

0

複数のインタフェースを実装しているのか、複数の継承を使用しているのかは、以前に説明した単一責任の原則に違反しているかどうかという疑問は、たとえばhereです。それについて明確なコンセンサスがないようです。私の意見では、あなたが使用しているSRPの定義が厳しくなっています。

コメントに記載されているSerializableインターフェイスは、メソッドを宣言していないマーカーインターフェイスであるため、特殊なケースです。しかし、通常は単独で使用する意味がないRunnableのような他のインターフェースがあります。

あなたの質問に戻る:はい、理論的にはDRYのような他の重要な原則を破ることなく可能ですが、繰り返すことはありません。中

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

分割結果:

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

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

今方法c()が重複しているだけで実装されたインタフェースで宣言されたメソッドを実装するだけでなく、独自の方法だけではなく、クラスを考えます。はい、あなたは追加のインターフェイスCを使用するか、このメソッドを何らかの種類のユーティリティクラスに入れることができますが、これは通常、デザインを改善しないと言います。

関連する問題