1

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

たとえば、私が持っている場合

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) {        
    }
}

使用しないメソッドがたくさんあります。たとえば、インターフェイスから1つのメソッドを使用する場合など、未使用の実装済みメソッドを削除する方法はありますか。

抽象も使用したくありません。これは、オブジェクトのインスタンスを作成できないことを意味します(少なくとも私のコンパイラはそう言っています)

4

6 に答える 6

5

具象クラスは、常にインターフェースのすべてのメソッドを実装する必要があります。まだ拡張していない場合は、JFrame拡張できますKeyAdapter。書き出さないようにするための空のメソッドを実装KeyListenerします。Foo次のように、クラス内で匿名クラスを使用できます。

addKeyListener(new KeyAdapter() {
    public void keyTyped(KeyEvent e) {
        // handle typed key here
    }
});
于 2011-04-13T10:40:06.543 に答える
4

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

于 2011-04-13T10:41:45.497 に答える
2

インターフェイスを実装する場合、実装されたオブジェクトは、実装が予想されるすべてのシナリオで使用できることを意味します。その観点から、インターフェイスのすべてのメソッドを実装する必要があることは非常に明白です。そうしないと、実装したとは言えません。たとえば、 andメソッドICalculatorを使用したインターフェイスがあり、実装のみが必要な場合、結果のクラスをICalculatorを必要とする別のプロジェクトで実際に使用できますか?AddSubtractAdd

ただし、インターフェイスの分離の原則に明らかに違反しているため、今日のフレームワークにいくつかのインターフェイスを実装することについてのあなたの怒りをよく理解しています。つまり、一部のインターフェイスは、何か便利なことを行うために一緒に使用できるいくつかの機能の塊です。たとえば、ICalculatorインターフェースの場合、基本的なAddメソッドなどではなく、オブジェクトの性質に不可欠ではないDivideようなメソッドを追加し始めました。StandardDeviationCalculator

結論として、はい、インターフェイスのメンバーを1つずつ実装する必要がありますが、一部のメンバーが使用されないことが確実でわかっている場合は、空のままにしておくか、さらに良い方法として、例外をスローさせてください。 、だからあなたは決して本当に決して決して意味しないことを確信するでしょう。

于 2011-04-13T10:50:55.890 に答える
2

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

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

于 2011-04-13T10:42:13.050 に答える
2

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

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

    private class MyKeyListener extends KeyAdapter{
        @Override
        public void keyPressed(KeyEvent arg) {          
        }
    }
}
于 2011-04-13T10:43:24.550 に答える
0

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

于 2011-04-13T10:40:53.783 に答える