1

ツール(イラストレーターペン、選択など)を作成するための抽象クラスがあります。アイデアは、ユーザーが必要に応じて新しいツールを簡単に作成できるということです。

一部のツールには、「draggingSelection」と呼ばれるメソッドがあります。クラスにそのオブジェクトがあるかどうかを確認し、ある場合はそれを実行する方法があるのだろうか。(この場合、draggingSelectionはブール値を返します)

これまでのところ、メソッドが存在するかどうかを判断できます。実行するメソッドを取得することしかできません。私はinvokeで物事を試しましたが、失敗しました。私のメソッドはパラメータを必要としません。誰かが助けることができます。

public boolean draggingSelection() {

    Method[] meths = activeTool.getClass().getMethods();
    for (int i = 0; i < meths.length; i++) {
        if (meths[i].getName().equals("draggingSelection")) {
            // how can i run it?
                        //return meths[i].draggingSelection(); // wrong     
        }
    }
    return false;

}
4

3 に答える 3

2

私の意見では、より良い解決策は、指定されたオブジェクトのクラスが何らかのインターフェイスを実装しているかどうかを確認することです。

ただし、draggingSelectionメソッドを呼び出すには、テストしているオブジェクトに対して実行します。

activeTool.draggingSelection()
于 2013-01-11T13:06:52.473 に答える
2

リフレクションを介してそれを行うこともできますが、はるかに優れた解決策は、関連するすべてのメソッドを備えたインターフェイスを用意することです。

public interface SelectionAware {
  public void draggingSelection(SelectionEvent e);
}

それができたら、それを使用するための(少なくとも)2つのオプションがあります。

  1. ツールにそのインターフェースを実装させ、myTool instanceof SelectionAwareその後にキャストを使用してそのメソッドを呼び出すか、
  2. initツールに、適切な方法でリスナーとして明示的に登録させます。

オプション1は、試行した内容に近いものですが、そのインターフェイスの使用を制限し、実際にはクリーンなコードではありません(一部のツールが何らかのインターフェイスを実装している場合、コードは「推測」する必要があるため)。

オプション2はおそらく少し手間がかかります(リスナーを登録/登録解除する場所/時期は?...)が、間違いなくよりクリーンなアプローチです。また、リスナーがツールであることに制限されないという利点もあります。何でもそのようなリスナーを登録できます。

于 2013-01-11T13:07:53.487 に答える
1
public interface Draggable {
    public boolean draggingSelection(int foo, int bar);
}

次に、このメソッドを持つクラスがある場合は、を追加するだけimplements Draggableです。例:

public class Selection implements Draggable {
    public boolean draggingSelection(int foo, int bar) {
        (insert code here)
        return baz;
    }
    (insert rest of code here)
}

したがって、あなたの例は次のようになります。

if (activeTool instanceof Draggable) {
    ((Draggable)activeTool).draggingSelection(foo, bar);
}
于 2013-01-11T13:06:59.570 に答える