2014-02-19 54 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