2011-04-13 54 views
0

インターフェイスのすべてのメソッドをオーバーライドする必要があるのはなぜですか?例えばインターフェイスの実装

私は

public class Foo extend JFrame implements ActionListener, KeyListener { 
     foo(){ 
     } 
    @Override 
    public void keyPressed(KeyEvent arg) {   
    } 

    @Override 
    public void keyReleased(KeyEvent arg) { 
} 

    @Override 
    public void keyTyped(KeyEvent arg) {   
    } 
} 

を持っている場合私ならば、国連を削除するが方法は、例えば、実装されているメソッドを使用している私は、私も使用しない方法の多くを持っているつもりですインターフェースから一つの方法を使用する予定

これは私がオブジェクトのインスタンスを作成することはできません手段として、私は

答えて

5

コンクリートクラス(少なくとも私のコンパイラは、そう言う)、いずれかの抽象使いたくありません常に実装する必要がありますインタフェースのすべてのメソッドを記述します。 JFrameをまだ延長していない場合は、KeyAdapterまで延長することができます。 KeyListenerのための空のメソッドを実装して、それらを書き出さないようにします。あなたは、このようなあなたのFooクラスの内部で匿名クラスを使用することができます。

addKeyListener(new KeyAdapter() { 
    public void keyTyped(KeyEvent e) { 
     // handle typed key here 
    } 
}); 
+0

私は1つのクラスだけを拡張できますか? – AlanFoster

+0

あなたは1つのクラスだけを拡張することができます。キーロジックを 'KeyAdapter'を拡張する別のクラスに分割する必要があります。次に、オーバーライドするメソッドを1つ書くだけで済みます。 – WhiteFang34

0

あなたは本当にオブジェクト指向プログラミングについての良い本をつかむと、最初の章を再検討すべきです。インターフェースはメソッドの完全な抽象定義なので、インターフェースを部分的に実装することはできません。

4

インターフェイスにはデフォルト実装がありません。インターフェイスで各メソッドを実装しなければならない場合、他のコードがインターフェイスを通じてこれらのメソッドを呼び出そうとするとどうなりますか?

2

これらの空のメソッドを持つFooの親クラスを作成し、Fooに表示するメソッドのみを実装させることができます。

インターフェイスを実装するときは、具体的なオブジェクトを作成するためのどこかのメソッドを実装する必要があります。

2

これはまさにKeyAdapterクラスのためのものであり、インターフェイスのすべてのメソッドを実装しています(実装は何もしません)。あなたは2つのクラスを拡張することはできませんので、あなたは(きれいなデザインがとにかくである)あなたのリスナーのための内部クラスを使用する必要があります:あなたがインターフェイスを実装する場合

public class Foo extend JFrame { 
     foo(){ 
      ... 
      component.addKeyListener(new MyKeyListener()); 
      ... 
     } 

    private class MyKeyListener extends KeyAdapter{ 
     @Override 
     public void keyPressed(KeyEvent arg) {   
     } 
    } 
} 
+0

私は2つの正解を与えることができたらいいと思います。これはJFrame自体に追加するにはどうすればいいですか?なぜなら、これはJTextFieldで動作することに注意してください。 – AlanFoster

+0

@ user551841:KeyListenersは実際にキーボードを取得するコンポーネントでのみ動作しますフォーカス。キーイベントをグローバルにリスニングするには、おそらくKeyEventDispatcherを操作する必要があります。または、キーイベントのような特定のキー(ホットキーなど)の場合は、キーバインディングを使用します。詳細は、チュートリアルを参照してください。http://download.oracle.com/javase/tutorial/uiswing/misc/keybinding.html –

2

、それが実装オブジェクトがいずれにも使用できることを意味しますシナリオでは、実装が期待されます。その点から、のインターフェイスのすべてのメソッドを実装する必要があります。そうでなければ、実際に実装したとは言えません。例えばAddSubtractメソッドを持つICalculatorインターフェイスを持っていて、Addしか実装したくない場合は、ICalculatorを必要とする別のプロジェクトで本当にそのクラスを使用できますか?

しかし、今日のフレームワークでいくつかのインターフェイスを実装することについてのあなたの怒りは、明らかにInterface Segragation Principleを壊してしまいます。その意味するところは、いくつかのインタフェースは、何か有用なことをするために一緒に使用できるいくつかの機能の塊であるということです。例えば。 ICalculatorがちょうど基本的なAddDivideなどのメソッドの代わりに、私はCalculatorオブジェクトの性質に不可欠ではないStandardDeviationのようなメソッドを追加し始めました。

ボトムライン、はい、あなたは確信しているし、それらのいくつかは使用されることはありませんことがわかっている場合は、空のそれらを残すこと自由に感じ、インターフェイスのメンバーの一人一人を実装する必要があり、それ以上に例外をスローするようにしてください。は決してが決して決して意味しません。

関連する問題