2013-07-16 16 views
11

はあなたが私はインターフェイスは、多重継承を実装するためのJavaの道であることを読んだ使用して、インターフェイスの利点は何ですか

public interface Change { 

    void updateUser(); 
    void deleteUser(); 
    void helpUser(); 

} 

インタフェースを持っているとしましょう。インターフェースを実装すると、そのメソッドにアクセスできます。私が理解していないのは、メソッドにはインターフェイスに本体がないため、クラスに本体を置く必要があるということです。インターフェイスが複数のクラスで実装されている場合は、メソッドに複数のクラスの本体を指定する必要があります。これは、クラス内に個別のメソッドを持ち、インターフェイスを実装しないだけの理由はなぜですか?

+3

あなたはライブラリとそのAPIの相棒を設計するための起動時に[多型](http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming) – Brian

+1

あなたはインターフェイスが役立つだろう:) –

+0

@Brian、多型ではありませんこの振る舞いはすでにサブクラス化によって生成できるので、完全な答えです。 – displayname

答えて

2

インターフェイスは、それを継承するすべてのメソッドがそのメソッドを持つことを保証します。そのため、インターフェイス内のメソッドを継承して安全に呼び出すことができます。

6

これは、クラス内に個別のメソッドを持ち、インターフェイスを実装していないだけの理由はなぜですか?

クラスCインターフェイスIを実装している場合Iが予想されるたびに、あなたはCを使用することができますので。

interface I { 
    void foo(); 
} 

class C1 implements I { 
    public void foo() { 
     System.out.println("C1"); 
    } 
} 

class C2 { // C2 has a 'foo' method, but does not implement I 
    public void foo() { 
     System.out.println("C2"); 
    } 
} 

... 

class Test { 
    public static void main(String[] args) { 
     I eye1 = new C1(); // works 
     I eye2 = new C2(); // error! 
    } 
} 
3

インタフェースを使用すると、特定のメソッドが存在することを保証して返すことができます:あなたがインターフェイスを実装していない場合は、(インターフェースによって義務付けられてあなたが適切なすべてのメソッドを提供していても)この操作を行うことができませんでした必要なタイプ。コンパイラがこれを知っているとき、その仮定を使用して、未知のクラスが特定の既知の振る舞いを持つかのように動作させることができます。例えば、同等のインタフェースは、実装クラスがcompareTo()と同様のオブジェクトを認識し、intを返すことを保証します。

これは、あなたがこのインタフェースを実装するものとを比較することができることを意味します - ので、あなたはそれがどのような分離LabelledBoxesOfBooksに

8

をソートするために、整数と別のものをソートする文字列と別のものをソートする代わりに、一つの方法を書くのと同等であるものを並べ替えることができます呼び出し元は実装から期待します。実装の知識がなくても呼び出すことのできる純粋なメソッドがあります。実際、JMSやJDBCのようなライブラリの中には、実装のないインタフェースがあります。

この分離は、実際の実装のクラスを知る必要はないことを意味します。

+2

なぜここにdownvote? – arshajii

0

インターフェイスを使用してAPIを定義することが容易になるため、インターフェイスのすべての具体的な実装によって、各クラスに期待されるメソッドが提供されます。

また、継承を実装する方法も提供されています。これは、クラス継承を継承した(Javaでは)不可能です。

24

私の大学の教授は、かつて多型性とカプセル化について説明する素晴らしい逸話を出しました。それはこのようになった。


ソーダマシンの仕組みを知っている人はいますか? (キューがなぜこれについて話すのか混乱しているのを見て)。いいえ?言っておくけど。

あなたは変更を取り入れて、マシンの中には、あなたが十分なお金を入れていることを確認するためにあなたのすべての変更を数える小さな猿です。あなたのソーダのボタンを押すと、あなたが押されたボタンを猿に伝える少しの光が当たって、あなたが正しい量の変化を入力したら、彼はあなたの選択をつかんで、あなたのソーダをつかむために小さな穴に投げる。

これはカプセル化の概念です。我々は、ソーダマシンの実装を非表示にします。あなたが内部を見ることができるようにそれらの空想的な、明確なウィンドウのいずれかを持っていない限り、あなたは正直なところ、それが本当にどのように動作するか分かりません。あなたが知っていることは、現金を入れてボタンを押して、十分に入れると飲み物を買うということだけです。それに追加する

、あなたはとてもため、限りマシンのインターフェイスは、あなたがそれを使用することができ、通常のソーダマシン・インターフェースを以下のように、ソーダマシンのインタフェースを使用する方法を知っています。これはインタフェース契約と呼ばれます。あなたが飲み物を飲み、寒くて、あなたが戻ってくる限り、マシンは南極からの飲み物をコンベアベルトで持ち歩くことができます。

ポリモーフィズムは、ソーダマシンインターフェイスを使用すると、さまざまなことを行う可能性があるという考えです。これが、カプセル化と多型が密接に関連している理由です。多形性では、SodaMachineの実装を使用していることが分かります。これは変更することができ、その結果、さまざまなことをバックグラウンドで行うことができます。これは、1つのオブジェクトのSodaMachineの能力が実際にインターフェイスの背後にあるマシンに応じて、MonkeySodaMachineConveyorSodaMachineの両方として実際に機能する多形性の駆動コンセプトにつながります。


おそらく言葉はないが、十分に近い。基本的には、polymorphismencapsulationという2つの概念に徹底的に陥っています。あなたが明確にしたいのなら教えてください。

+3

非常に良いアナロジー。 1つの強力なものは、ソーダマシンが一杯になっているトラックを注文することです。 – jahroy

+0

xMonkey.java、yMonkey.javaのように、それぞれの種類の飲み物に複数の猿があった方が良いアナロジーであったかもしれません。 – ralzaul

+0

私はこのソーダマシンの例が抽象化にもっと関連しているように感じます。 IMO idk –

関連する問題