Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用';instanceof';Java中的重载方法解决方案_Java_Refactoring_Overloading - Fatal编程技术网

使用';instanceof';Java中的重载方法解决方案

使用';instanceof';Java中的重载方法解决方案,java,refactoring,overloading,Java,Refactoring,Overloading,我有一段来自GWT的代码正在运行: public void processOperator(final AbstractOperator op) { System.out.println("Wordt deze ooit aangeroepen?"); if (op instanceof BinaryOperator) { if ((data.getLastOperator() == null) || (data.isLastOpEqual

我有一段来自GWT的代码正在运行:

public void processOperator(final AbstractOperator op) {
        System.out.println("Wordt deze ooit aangeroepen?");
        if (op instanceof BinaryOperator) {
            if ((data.getLastOperator() == null) || (data.isLastOpEquals())) {
                data.setBuffer(Double.parseDouble(data.getDisplay()));
                data.setInitDisplay(true);
            } else {
                data.getLastOperator().operate(data);
            }
            data.setLastOperator(op);
        } else if (op instanceof UnaryOperator) {
            op.operate(data);
        }

        data.setLastOpEquals(false);
}
我想通过使用方法分派消除“instanceof”部分:

public void processOperator(final BinaryOperator op) {
    if ((data.getLastOperator() == null) || (data.isLastOpEquals())) {
        data.setBuffer(Double.parseDouble(data.getDisplay()));
        data.setInitDisplay(true);
    } else {
        data.getLastOperator().operate(data);
    }
    data.setLastOperator(op); 
    data.setLastOpEquals(false);
}

public void processOperator(final UnaryOperator op) {
    op.operate(data);
    data.setLastOpEquals(false);
}
但是现在我在下面的代码中遇到了麻烦,代码来自ButtonOperator类。以下代码将AbstractOperator作为构造函数中的类型。类型UnaryOperator和BinaryOperator的代码看起来完全相同,因此必须为它们创建包含完全相同代码的特殊构造函数,这感觉有点麻烦。什么是更好的方法

public ButtonOperator(final CalculatorController controller,
        final AbstractOperator op) {
        super(op.label);

        this.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                controller.processOperator(op);
            }

        });
        this.setStyleName(CalculatorConstants.STYLE_BUTTON);
    }

不幸的是,这行不通。当您有重载方法时,将在编译时根据参数表达式的静态类型决定调用哪个方法。例如:

UnaryOperator uop = new UnaryOperator(...);
AbstractOperator aop = uop;

...

// This will call the "unary" version of the method
processOperator(uop);

// This will call the "abstract" version of the method
processOperator(aop);

只有当方法被重写时,才能得到方法调用的运行时调度。

Stephen C解释了原因

要解决这个问题,您可以决定将
processOperator()
方法移动到
AbstractOperator
类,并让具体的类实现它:

op.processOperator(controller);
或利用:


+1用于建议访问者模式,这是“解析树”或“表达式评估”中的典型方法。
op.processOperator(this); // this = controller.