11

それがインターフェースの目的であり、クラスを抽象化してエスケープすることができることを私は知っています。

しかし、インターフェイスで宣言するすべてのメソッドを実装する用途はありますか? そのクラスに関係なくても、すべてのメソッドを定義し続けると、コードの重量と複雑さが増しませんか? なぜそのように設計されているのですか?

4

6 に答える 6

21

Java におけるインターフェースの概念は、コントラクトに非常によく似ています(そしておそらく、振り返ってみると、これは概念の名前であったはずです)。

インターフェースを実装するクラスは、契約に記載されているすべてのものを提供することを厳粛に約束し、インターフェースを実装するクラスを使用すると、その機能が利用可能であることが保証されるという考え方です。

私の経験では、この施設は Java で大聖堂を建設することを可能にするものの 1 つです。

于 2012-08-25T12:17:45.880 に答える
8

あなたが批判しているのは、まさにインターフェイスが達成する目標です。インターフェイスを実装したくない場合は、それを実装するクラスを宣言しないでください。

そのクラスに関係なくても、すべてのメソッドを定義し続けると、コードの重量と複雑さが増しませんか?

インターフェイスに対してプログラミングを行う場合、その背後にある具象オブジェクトがそのすべてのメソッドを実装する必要があります。具象オブジェクトがすべてのインターフェイス メソッドを必要としない、または実装できない場合は、おそらく設計上の問題を修正する必要があります。

于 2012-08-25T11:56:59.087 に答える
6

コードの一部が、その背後にあるクラスを知らずにインターフェースのインスタンスを受け取った場合、そのコードは、インターフェース内の任意のメソッドを呼び出すことができることを保証する必要があります。これが、インターフェイスを呼び出し元と機能のプロバイダー間の契約にするものです。これを実現する唯一の方法は、インターフェースを実装するすべての非抽象クラスに、そのすべての関数の実装を提供するよう要求することです。

一部の機能を実装しない必要性に対処するには、一般的に次の 2 つの方法があります。

  • をスローするテスター メソッドと実装の追加UnsupportedOperationException、および
  • 必要に応じてインターフェイスをパーツに分割して、パーツのすべてのメソッドを実装できるようにします。

最初のアプローチの例を次に示します。

public interface WithOptionalMehtods {
    void Optional1();
    void Optional2();
    boolean implementsOptional1();
    boolean implementsOptional2();
}

public class Impl implements WithOptionalMehtods {
    public void Optional1() {
        System.out.println("Optional1");
    }
    public void Optional2() {
        throw new UnsupportedOperationException();
    }
    public boolean implementsOptional1() {
        return true;
    }
    public boolean implementsOptional2() {
        return false;
    }
}

2 番目のアプローチの例を次に示します。

public interface Part1 {
    void Optional1();
}
public interface Part2 {
    void Optional2();
}
public Impl implements Part1 {
    public void Optional1() {
        System.out.println("Optional1");
    }
}
于 2012-08-25T11:58:08.030 に答える
1

そのクラスに関係なくても、すべてのメソッドを定義し続けると、コードの重量と複雑さが増しませんか?

はい、そうです。そのため、使用しないインターフェイスの実装をクライアントに強制しないことを推奨するインターフェイス分離の原則に従うことがコーディングのベスト プラクティスです。したがって、多くのメソッドを持つ 1 つの「太い」インターフェイスを持つべきではありませんが、メソッドをグループ化する多くの小さなインターフェイスを使用し、各グループが特定の動作またはサブモジュールを提供します。 このようにして、インターフェイスのクライアントは、必要のないメソッドの実装を強制されることなく、必要なメソッドのみを実装します。

于 2012-08-25T12:13:08.287 に答える
0

インターフェイスを実装するとき、インターフェイスで宣言されたすべてのメソッドを定義する必要はない場合があります。ボディ内に何もない必要のないいくつかのメソッドを定義できます。

于 2015-01-23T08:50:06.047 に答える
0

Liskov Substitution Principleに依存する場合があります

したがって、が必要なときにA implements B使用できる手段を持つこと、および問題なく動作させるためには、少なくとも.ABAB

公式の情報源に基づいていないため、私の回答は「適切な」回答ではないことに注意してください。

于 2012-08-25T11:58:54.933 に答える