2

Eclipseを使用して、を実装することにしましたinterface。Eclipseはメソッドシグネチャを自動的に生成します。

インターフェイスの一部のメソッドには、メソッドに渡されるパラメーターがあります。これらのパラメータはどこから来ていますか?それらは私が実装しているインターフェースにはありませんよね?

たとえば、ActionListenerインターフェイスを実装する場合、次のメソッドを実装する必要があります。

@Override
public void actionPerformed(ActionEvent arg0){
...
}

オブジェクトはどこActionEventから来ていますか?

4

3 に答える 3

4

さて、これらのパラメータはどこから来たのですか?それらは確かに私が実装しているインターフェースにはありませんよね?

実際、間違っています。これら、実装しているインターフェースの一部です。

ActionListener例として取り上げましょう。ドキュメントから:

void actionPerformed(ActionEvent e)
                     ^^^^^^^^^^^^^
于 2013-01-30T19:44:11.950 に答える
3

Javaでのインターフェース定義は、何よりも契約または約束のように考えることができます。インターフェースを実装すると主張することにより、クラスは、その中で定義されたメソッドの実装を持つことを約束します。たとえば、実装するクラスは、何も返さず、オブジェクトをメソッドに渡す必要がActionListenerあるメソッドの実装を提供することを約束します。actionPerformedActionEvent

メソッドが他のクラスによって呼び出された場合にのみ、ActionEventオブジェクトが存在して渡される必要があります。インターフェイス定義およびクラスの実装では、単にActionEvent渡されることを前提としています。これですべてです。これは、パラメーターを受け取る他のメソッドとまったく同じです。呼び出し元は問題のデータを提供する必要があり、メソッドは単にそれを利用します。

なぜactionPerformedが必要なのかについては、 ActionEvent2つの異なるレベルで答えることができます。

  1. のインターフェイス定義でActionListenerは、正確なメソッドシグネチャを要求することでそれを義務付けているためです。(これは「私がしないとなぜコンパイルされないのか」という答えです。)
  2. インターフェイスを作成したJavaAPI設計者は、それがインターフェイスの動作方法であると判断したためです。(「アクションイベント」をリッスンすることになっているので、それは理にかなってActionListenerいます。したがって、アクションイベントの情報を持つオブジェクトが渡されるのは当然です。提供された情報に基づいて行動するのは実装クラスの責任です。これは「なぜ彼らはそれをこの特定の方法にしたのか」と答えます。)

このすべてのポイントは何ですか?答えはポリモーフィズムです。の場合、異なる実装ActionListenerのグループ全体をActionListenersSwingコンポーネントに登録することが可能であり、それらすべてがメソッドを持つことが保証されているため、すべて同じ方法で呼び出すことができますvoid actionPerformed(ActionEvent e)。つまり、Swingコンポーネントは、実装(その動作が実際にどのように機能するか、および/またはそれを呼び出す方法)ではなく、各リスナーのインターフェイス(動作が期待されるもの)のみを考慮することができます。

于 2013-01-30T19:47:49.793 に答える
2

ここでの ActionEvent は、 actionPerformed に提供する必要があるものであり、ここの API でそう述べています

プログラミングの多くは、既存のツールを使用しています。つまり、クリックする三目並べゲームを作成したい場合は、ActionEvent または java.MATH を使用する必要があります。

于 2013-01-30T19:44:21.337 に答える