4

私は Java プログラマーの初心者であり、Java 言語での OOP の実装の全体像を把握するのに苦労しています。

以下の疑似コードで質問を構成しようとします(それほどきれいではない場合はお詫びします):

interface{
  foo();
}

class a {
  //stuff
  foo() OPERATIONS;
}
class b {
  //stuff
  foo() OPERATIONS;
}

//The OPERATIONS segment is actually the *work* the foo does: i.e., if foo were 
//print, it would be the System.out.println("");

インターフェースの 'foo' OPERATIONS が宣言されているのが実際のクラス内にある場合、インターフェースの目的は何でしょうか? インターフェイスの目的は、クラスの難読化のすべての外側にある「メソッドグラブバッグ」を作成して、コードの一部で変更して適用できる階層を再構築する必要がないようにすることだと思いました多くの実装クラス。言い換えれば、インターフェースは「C」言語で関数が使用されるようなものになると想像しました。隔離された簡潔な操作のセットがクラスター化され、必要に応じて呼び出されるようにカプセル化され、コードセグメントにグループ化されて、インターフェイス内の foo の操作を変更すると、インターフェイスを実装するすべてのクラスに適用されます。私は何が欠けていますか?

ありがとう!

4

8 に答える 8

3

インターフェイスは、クラスが何を行うかについての契約を指定しますが、それがどのように行うかについては指定しません。ソートアルゴリズムを想像してみてください。多くの実装が存在する可能性があります。

public interface Sorter {

    void sort(List<String> list);

}

バブルソート、マージソート、クイックソートなどを使用できます

しかし、ソーターのユーザーとしては気にしないかもしれません。

class SortClient {

    SortClient(Sorter sorter, List<String> list) {
      sorter.sort(list);
    }

}

SortClient、ソートされるだけで、どのようにソートするかは気にしません。

Spring や Guice などの依存性注入を行うフレームワークでは、これが非常に重要になります。これらのフレームワークを使用すると、ユーザーを変更することなく、どの実装を使用するかを構成できます。

インターフェイスには他にも実用的な用途があります。テスト用のモック/スタブを作成するのに役立ちます。上記のSortClient場合、次のようなソーター用のスタブを作成したい場合があります。

ExceptionThrowingStubSortClient implements Sorter {
   void sort(List<String> list) {
      throw new SortException("Testing the exception handling");
   }
}
于 2013-10-09T00:05:34.493 に答える
2

まず、インターフェースとは何ですか?を読んでください。.

基本的に、インターフェースは、すべての実装interfaceinterface. 実装は、実際のコード化された実装を提供する代わりに空のメソッドを実装することを決定する場合があることに注意してください。これは実装次第ですが、 によって記述されたメソッドinterfaceをインターフェイスの実装で呼び出すことができることを保証します。

例えば...

public interface Foo {
    public void doBar();
}

の実装は、何も返さないfoo呼び出しメソッドを提供しなければならないことを示します ( )...doBarvoid

をインスタンスinterface化できません

できないという意味

Foo foo = new Foo(); // Compiler error...

interfaceしかし、具体的に実装することができますclass...

public class FooBar implements Foo {
    public void doBar() {
        // Functional implementation of doBar...
    }
}

これで、FooBar...のインスタンスを作成できるようになりました。

FooBar fooBar = new FooBar();
fooBar.doBar();

の実装を...Fooのインスタンスであるかのように扱うこともできます。Foo

Foo foo = new FooBar();
foo.doBar();

(ps- はい、技術的には、これは のインスタンスではなく、Foo単純に のFooBarように動作することはわかっていますFoo;))

これがポリモーフィズムの核心です

これにより、コードは の実装を気にする必要がなくFoo、 とやり取りできることのみを考慮する必要があるため、コードを分離できFooます。

これにより、実装へのアクセスを制限することもできます。つまりFoo、 method のみを定義するためdoBar、 の実装を期待するメソッドはFoo他のメソッドを呼び出すことができません。doBar

(ps-はい、これを回避する方法があることは知っていますが、そうすべきではないという意図があります!)

これは、実装ではなくインターフェイスへのプログラムの核心になります

于 2013-10-09T00:06:59.457 に答える