16

このコードは完全に機能します。メソッド test() は、両方のインターフェースで機能します。ボンネットの下で正確に何が起こっているのですか?そして、この機能は実際のシナリオでどのように役立ちますか?

interface A
{
    void test();
}

interface B 
{
    void test();
}

class C implements A, B
{

    public void test() 
    {
        System.out.println("abc");
    }
}

   A a = new C();
   a.test();
   B b = new C();
   b.test();
4

5 に答える 5

7

2 つのインターフェイスがあるとします...

public interface StockBroker{
        //Give our client some investment strategies.
        public String adviseClient(Client c);
}

public interface Doctor{
  //Examine our client and give them some medical advice
        public String adviseClient(Client c);
}

そして、両方のインターフェースを実装するクラス....

public class JackOfAllTrades implements StockBroker, Doctor{
   public String adviseClient(Client c){
   }
}

両方のインターフェースを 1 つのメソッドで実装することは構文的には正しいかもしれませんが、目的の動作が得られない場合があります。たとえば、株式仲買人と医師は、通常、それぞれのクライアントに対して非常に異なるアドバイスを提供します。

インターフェイスを実装するオブジェクトを使用する人は、メソッドが医学的アドバイスを提供することをDoctor期待しています。adviseClient()しかし、インターフェイスを実装するオブジェクトを使用している人は、メソッドが投資戦略を提示することをStockBroker期待しています。adviseClient()

この場合、オブジェクトJackOfAllTradesは、どのタイプのアドバイスを発行すればよいかわかりません。なぜなら、adviseClient()メソッドには、呼び出されたときにどのインターフェースを実装する必要があるかを伝えるパラメーターがないからadviseClient()です。

これは Java の欠点です。インターフェイスをDoctor設計する人は、他の誰かがStockBroker同じメソッド シグネチャを使用してインターフェイスを設計することを知る方法がなかった可能性があるためです。

インターフェイスを作成する人にとっては、メソッド名を十分に一意にして、名前の衝突がまれになるようにすることをお勧めします。

于 2016-11-03T02:21:38.650 に答える
6

JLS §8.4.8.4によると、

オーバーライドと同等のシグネチャを持つメソッドの継承

クラスがオーバーライドと同等のシグネチャを持つ複数のメソッドを継承することは可能です (§8.4.2)
…<br> インターフェイスから同じメソッド宣言を継承するパスがいくつか存在する可能性があります。この事実によって問題が生じることはなく、それ自体がコンパイル時のエラーになることはありません。

クラスに同じ名前と署名を持つ複数の宣言がある場合、クラスは複数のパス (たとえば、インターフェイスを実装し、そのインターフェイスを実装するクラスをサブクラス化するなど) を介して宣言を継承している可能性があるため、害はないと思われます。 .

于 2013-07-05T08:33:03.093 に答える
2
interface A
{
void test();
}

interface B 
{
void test();
}
class C implements A, B {

    public void test() 
    {
        System.out.println("common to all");
    }
    public A choose(A a){
        return new A(){
           public void test() {
                System.out.println("test of A");
           }
        };
    }
    public B choose(B b){
        return new B(){
           public void test() {
            System.out.println("test of B");
           }
        };
    }
}
class Demo {
   public static void main(String[] args) {
   C c =new C();

   A a = new C();
   B b = new B();

   a = c.choose(a);
   b = c.choose(b);

   a.test();
   b.test();
   }
}
于 2013-10-15T11:49:13.473 に答える