0

私は、私が抱えている問題に対してまともな解決策を作成しようとしています。言葉で説明できますが、コードはより明確になります。

public void actionPerformed(ActionEvent e) {       
        if(e.getSource().equals(ClassA.getButtonOne()) ||
            e.getSource().equals(ClassB.getButtonOne())) {         
            ???????.setEnabled(false);          (class a or class b)
        }

説明: e.getSource() を適切なクラス タイプに変更して、メソッドを実行できるようにするにはどうすればよいですか? 追加の詳細: 上記の「setEnabled」の例では、if ステートメント内のすべてのメソッドが、実行したいメソッドを持っていると確信しています。複数の if ステートメントを作成することで問題を解決できますが、重複したコードが作成されます (特に、クラス C と D も将来的に存在するため)。

4

2 に答える 2

3

同じリスナーを使用する必要がある場合、要件は訪問者または二重ディスパッチパターンのように見えます。ソースクラスにリダイレクトする必要があります。

public void actionPerformed(ActionEvent e) {       
        Object source = e.getSource();
        if (source instanceof MySource) {
           ((MySource)source).executeOnEvent(e, this);
        }
         ....

このようにして、多くの「if」を実装する必要はありません(これは、エラーが発生しやすく、冗長であることがわかりました)。イベントの受信時にオブジェクト タイプを確認し、必要に応じてコールバックするだけです。上記では、イベントとイベントを受け取るオブジェクトを使用してコールバックしていることに注意してください。ただし、どのパラメータが重要/関連するかは選択できます。

于 2012-10-22T08:58:48.727 に答える
1

考えられるすべてのソースに対して異なるリスナー インスタンスを使用し、問題を完全に回避します。

于 2012-10-22T09:01:29.820 に答える