如何在超类

时间:2016-09-21 16:50:42

标签: android inheritance android-asynctask

我对抽象类有疑问。

我正在开发一个Android应用程序并编写了一个抽象类,它扩展了AsyncTask< Void,Fragment,Fragment>类。 doInBackground方法已经在我的抽象类中有一个主体,但我不想在这里返回任何内容。现在我扩展该抽象类的子类应该再次覆盖doInBackground方法,调用super,做一些工作然后返回一个值。

我的抽象类中的方法如下所示:

@Override
protected Fragment doInBackground(Void... params) {
    //do some work without returning a value
}

我的扩展子类中的方法如下所示:

@Override
protected Fragment doInBackground(Void.. params) {
    super.doInBackground();
    MyFragment fragment = new MyFragment();
    //do some work with the fragment
    return fragment;
}

因此,如果我的抽象类中没有return语句,Android Studio会使用“Missing return statement”错误标记我的方法。有没有办法避免这个错误消息,因为我的子类有一个返回值,所以应该没问题,是吗?

2 个答案:

答案 0 :(得分:1)

注意:这是一般答案,忽略了问题中显示的具体情况,可能有意义也可能没有意义(见comment)。

如果该方法应该返回一个值,但是超类中的实现不能返回一个值,那么它就不是该方法的实现。

如果您仍然需要超类中的一些公共代码,请在单独的方法中编写该代码。

abstract class Super {
     public abstract MyObj method();
     protected final void commonLogic() {
         // common logic here
     }
}
class Sub extends Super {
    @Override
    public MyObj method() {
        commonLogic();
        // code here
        return /*something*/;
    }
}

如果要强制执行公共逻辑,请使用template method pattern

abstract class Super {
     public final MyObj method() {
         // common logic here
         return afterCommonLogic();
     }
     protected abstract MyObj afterCommonLogic();
}
class Sub extends Super {
    @Override
    protected MyObj afterCommonLogic() {
        // code here
        return /*something*/;
    }
}

答案 1 :(得分:0)

参考Ajay P. Prajapati的回答 - 我认为这并没有正确地解决他的要求。 AsyncTask在一轮中使用Java对象Void以便在Java语言中同化void - 注意大写和小写的差异V.我的建议是更改为{{1}在您的抽象类中,您可以AsyncTask<Void, Object, Object>,在您的子类中,您可以return new Void()