2010-06-29 50 views
4

我有这样一段代码从GWT在行动“的instanceof”到重载方法解决:重构一些代码在Java

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

回答

6

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

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

只有在方法被覆盖时,才会获得方法调用的运行时调度。

3

Stephen C解释了原因。

为了解决这个问题,你可以决定是移动processOperator()方法的AbstractOperator类,并有具体的类实现它:

op.processOperator(controller); 

或使用visitor pattern的:

op.processOperator(this); // this = controller. 
+0

+ 1用于暗示在“解析树”或“表达评估”中作为典型方法的访问者模式。 – 2011-06-01 12:54:15