1

Aclass によって実装されている interface があるとしますB

public interface A {
    public int getValueForName(String name);
}

public class B implements A {

    public int getValueForName(String name) {
        //implementation
    }

    public String getNameForValue(int value) {
        //implementation
    }

}

のインスタンスが参照されるAたびにプログラマが一貫して type を使用する場合、 で定義されているが で指定されていないメソッドは隠され、 type の参照を保持するコードからはアクセスできません。BgetNameForValue()BAA

このアプローチには致命的な欠陥があるようです。B( type でA) accessのインスタンスを参照するコードはどのようにできますgetNameForValue()か?

4

3 に答える 3

3

本当の欠点は、インターフェイスの契約が守られていないことです。インターフェイスを使用している場合、インターフェイスで定義されているメソッド以外は気にする必要はありません。

操作したいメソッドがインターフェイスで定義されていない場合は、その新しいメソッドに対応するようにインターフェイスを更新するか、別のインターフェイスを使用する必要があります。

たとえば、Collection。のコントラクトにバインドされているインスタンスがある場合CollectionIterator. ただし、取得している要素のタイプが であることはわかっています。代わりに、より強力な をList使用したいと考えています。ListIterator

問題はCollection、私がにアクセスする方法を定義していないことですListIterator。したがって、私には 1 つのオプションしかありません (Collectionインターフェイスを不必要に更新することはできないため):List代わりにインターフェイスを使用します。

独自のコードでこのシナリオに遭遇した場合、インターフェイスは必要なメソッドをサポートしていません。インスタンスレベルではなく、インターフェイスレベルでそのサポートを追加します。

于 2013-10-14T03:28:01.377 に答える
1

B のインスタンス (タイプ A) を参照するコードは、どのようにして getNameForValue() にアクセスできますか?

インスタンスを型 B にキャストする。

インターフェイスの目的の 1 つは、2 つ以上の型に共通するメソッドを定義することです。これは、可能なすべての型のすべての可能な組み合わせに対してインターフェイス メソッドを定義するという意味ではなく、インターフェイスを介して公開するすべての型に共通のメソッドのみを定義するという意味です。

したがって、定義上、インターフェイス型のインスタンスを持つことは、インターフェイスを介してアクセスできない元の型にメソッドがある可能性があることを前提としています。それがまさにそれがどのように機能するかです。

インターフェイスを使用するもう 1 つの理由は、機能を指定することです。したがって、クラスが Iterable である場合、それは反復できることを意味します。Iterable インスタンスを取得しようとしている場合、Iterable のメソッドを実装するクラス内のメソッドは気にしますが、その他のメソッドは気にしません。それらは Iterable 機能とは何の関係もないからです。

要するに、これは欠点ではなく機能です。

于 2013-10-14T03:33:40.013 に答える