2014-02-19 60 views
0

我正面臨類似於Java中的陰影的問題。我有以下代碼:父類方法在子類方法之前被調用

public abstract class AsyncCallback<T> implements com.google.gwt.user.client.rpc.AsyncCallback<T>{ 
    @Override 
    public void onFailure(Throwable caught){ 
    try{ 
     throw caught; 
    }catch(){ 

    }//various catch blocks 
    . 
    . 
    catch(Throwable e){ 
     onError(); 
    } 
    } 

    public void onError() { 
     //print something 
    } 

    abstract public void retry(); 
} 

現在我打電話以下語法一個RPC調用:

rpc.callAnyMethod(param, new AsyncCallback<SomeClass>(){ 
      @Override 
      public void onSuccess(SomeClass class) { 
       setSomeClass(class); 
      } 

      @Override 
      public void onFailure(Throwable caught) { 
       try { 
        throw caught; 
       } catch (ClientException e) { 
        if (e.getMessage().equals(sometoken)) { 
         //redirect to a link      
        } 
       } catch (Throwable e) { 
        retry(); 
       } 
      } 

      @Override 
      public void retry() { 
       //call the method again. 
      } 
}); 

但問題是,在父類XYZ從onError的印刷方法()函數首先,然後重定向到我想要的鏈接。

任何幫助,將不勝感激。

+0

請注意,將異常用作流量控制並不是一個好習慣。 –

+1

既然你創建了一個匿名的'AsyncCallback',你的XYZ類將如何被隱含在這個代碼中呢?您是否設置了默認處理程序? –

+0

抱歉好心地檢查代碼現在... :) – Sourabh

回答

1

重新設計您的類層次結構,您不會覆蓋/隱式調用具體的行爲 - 當行爲被覆蓋/擴展/調用時,它是繼承層次結構問題的常見來源 - 用Checkstyle的話語說話,類的方法應該是final(不允許覆蓋),abstract或empty(允許覆蓋)。

編輯避免這種行爲的一個常見模式是模板方法模式(http://en.wikipedia.org/wiki/Template_method_pattern)。

+0

好吧,如果要遵循這種模式,那麼我不應該在onError方法中打印任何東西....那麼onFailure方法中的try catch塊呢? – Sourabh

+0

雖然我沒有明確地調用super.method。所以我不知道爲什麼它會從匿名對象創建中調用? – Sourabh

+0

我不介意 - 調試你的代碼,但這種隱式行爲覆蓋是錯誤的常見來源。你可以檢查你的繼承類的哪個語句在父類中調用了錯誤的方法,並改變你的發佈。 – Smutje