Mic*_*ent 4 java refactoring overloading
我有来自GWT in Action的这段代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
我想通过使用方法分派来消除'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);
}
Run Code Online (Sandbox Code Playgroud)
但是现在我在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);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用.当您重载方法时,根据参数表达式的静态类型,在编译时决定调用哪一个.例如:
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);
Run Code Online (Sandbox Code Playgroud)
只有在重写方法时才会调用方法调用的运行时调度.
| 归档时间: |
|
| 查看次数: |
1453 次 |
| 最近记录: |