使用';instanceof';Java中的重载方法解决方案
我有一段来自GWT的代码正在运行:使用';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
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.