2010-06-29 55 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