1

我有一个抽象类来创建工具(如插画笔、选择等)。这个想法是用户可以根据需要轻松创建新工具。

一些工具有一个名为“draggingSelection”的方法。我想知道是否有办法检查一个类是否具有该对象,如果有,请运行它。(在这种情况下 draggingSelection 返回一个布尔值)

到目前为止,我可以弄清楚该方法是否存在。我只是无法让它运行的方法。我尝试了调用,但我失败了。我的方法不需要任何参数。有人能帮忙吗。

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

一旦你有了它,你有(至少)两个选项来使用它:

  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 回答