2016-12-22 14 views
0

最近私はインタビューでそれに直面しています。我々はインターフェイスI1method()は、実行時に"Oops"を印刷する​​とインタフェースI2method()を印刷するように実装する必要があるとして、 私たちはここに二つのインターフェースクラスAでマルチプルインターフェイスを実装するための別のボディ

interface I1{ 
    void m1(); 
    void m2(); 
    void method(); 
} 

interface I2{ 
    void m3(); 
    void m4(); 
    void method(); 
} 

class A implements I1,I2{ 
    void m1(){} 
    void m2(){} 
    void m3(){} 
    void m4(){} 

    void method(){} 
} 

を持っているの要件が来ます。しかし、クラスAの実装では、method()を1つだけ持つことができます。(ref) これを達成する可能性はありますか?

+0

は、デフォルトのメソッドを使用することはできますか?この場合、私はそれぞれのインターフェイスでデフォルトの実装を使用して、あなたが求めているものを達成します。 [this](https://blog.idrsolutions.com/2015/01/java-8-default-methods-explained-5-minutes/) – Dana

+0

いいえ、それはjdk 1.1バージョンです。どうすればいいですか? – snofty

+0

[同じメソッドでクラス内に2つのインタフェースを実装する]の可能な複製。どのインターフェイスメソッドがオーバーライドされますか?](http://stackoverflow.com/questions/2801878/implementing-two-interfaces-in-a-class-with-same-method-which-interface-method) – Paul

答えて

-2
interface I1{ 
public void m(); 
} 
interface I2{ 
public void m(); 
} 

public class Test{ 

public static void main(String[] args){ 
    I1 i1 = new I1(){ 
     public void m(){ 
      System.out.println("W"); 
     } 
    }; 
    I2 i2 = new I2(){ 
     public void m(){ 
      System.out.println("M"); 
     } 
    }; 
    i1.m(); 
    i2.m(); 
} 


} 
+0

私はあなたの質問はclear.whyインターフェイスが何かを印刷するメソッドの本文を持つことができないと思う。 – wylasr

+0

これは達成できるかどうか、Javaの継承原則を検証するために尋ねられる質問であり、印刷は出力を識別する単なる選択肢でした。 – snofty

1

あなたは、インターフェイスのメソッドのデフォルト実装を与えることができます:

public interface I1 { 
    default void method() { 
     System.out.println("Test"); 
    } 
} 

public interface I2 { 
    default void method() { 
     System.out.println("Oops"); 
    } 
} 

両方のインターフェイスを実装するとき、あなたは、次の構文

public class A implements I1, I2 { 
    @Override 
    public void method() { 
     I1.super.method(); //or I2.super.method() 
    } 
} 
で起動したいデフォルトの実装を選択することができます

"Test Oops"を印刷する必要がある場合は、2つのデフォルトの実装を呼び出して(注文を選択することもできます)

public class A implements I1, I2 { 
    @Override 
    public void method() { 
     I1.super.method(); 
     I2.super.method(); 
    } 
} 

編集

のJava 8の前に、あなたが似た何かを達成することができますが、それははるかに冗長です。 (私はここdecoratorのいくつかの種類を使用していますことに注意してください)

public interface I1 { 
    void m1(); 
    void m2(); 
    void method(); 
} 

public interface I2 { 
    void m3(); 
    void m4(); 
    void method(); 
} 

public final class DefaultI1 implements I1 { 
    @Override 
    public void m1() { 
     //TODO 
    } 

    @Override 
    public void m2() { 
     //TODO 
    } 

    @Override 
    public void method() { 
     System.out.println("Test"); 
    } 
} 

public final class DefaultI2 implements I2 { 
    @Override 
    public void m3() { 
     //TODO 
    } 

    @Override 
    public void m4() { 
     //TODO 
    } 

    @Override 
    public void method() { 
     System.out.println("Test"); 
    } 
} 

public final class A implements I1, I2 { 
    private final I1 i1; 
    private final I2 i2; 

    public A(I1 i1, I2 i2) { 
     this.i1 = i1; 
     this.i2 = i2; 
    } 

    @Override 
    public void m1() { 
     i1.m1(); 
    } 

    @Override 
    public void m2() { 
     i1.m2(); 
    } 

    @Override 
    public void m3() { 
     i2.m3(); 
    } 

    @Override 
    public void m4() { 
     i2.m4(); 
    } 

    @Override 
    public void method() { 
     i1.method(); 
     i2.method(); 
    } 
} 

使用

public static void main(String[] args) { 
    A a = new A(new DefaultI1(), new DefaultI2()); 
    a.method(); //prints "Test Oops" 
} 
+0

入力のためのthxsは、デフォルトのメソッドとのインターフェイスは、最新のJDKを紹介、古いバージョンでそれを達成することはできますか? – snofty

+0

@snofty私の編集を参照してください。 – Spotted

+0

これは良いことですが、javaの同じクラスに2つの同じメソッドを書くことはできませんが、 'm1()、m2()..'メソッドはどうでしょうか?クラスAでは 'm1(){i1.m1();}'を実装でき、 'DefualtI1'クラスは' m1() 'メソッドを実装する必要があります。 – snofty

関連する問題