Java如何在抽象类中选择覆盖方法?

时间:2012-09-27 11:29:38

标签: java class methods abstract

假设我们有一个基类:

public abstract class BaseFragment extends Fragment {
    ...
    protected abstract boolean postExec();
    ...
}

然后从中派生出其他类(例如Fragment_Movie,Fragment_Weather ......)

public class Fragment_Music extends BaseFragment{
    @Override
    protected boolean postExec() {
        return false;
    } 
}

但是,在向基类添加新方法时:

public abstract class BaseFragment extends Fragment {
    ...
    protected abstract boolean postExec();
    protected abstract boolean parseFileUrls();
    ...
}

Eclipse会立即显示错误,要求在已派生的类中实现此新方法。

是否在基类中添加“默认”抽象方法,即使我们没有在派生类中实现它也不显示错误? (因为每次基类附加新方法时都需要花费大量时间来修复每个派生类。)

5 个答案:

答案 0 :(得分:34)

最简单的解决方案是使用存根实现添加方法。声明为abstract 需要非抽象扩展来实现该方法。

做这样的事情会减轻你的编译问题,虽然在没有覆盖的情况下显然会抛出异常:

public abstract class BaseFragment extends Fragment {
    protected boolean doSomethingNew() {
        throw new NotImplementedException("method not overridden");
    }
}

答案 1 :(得分:2)

不要求抽象类(包括接口)从其基类声明所有方法。

因此,例如,扩展一个基类或实现一个接口的接口或抽象类不必声明所有方法。 未实现方法的实现将是第一个更深层次的具体子类的工作。

因此,对于您的问题,您最终可以使用组合而非继承添加协作者(包含新的常用方法)作为基类的受保护字段。

因此,不需要在具体类中实现任何内容,并允许这些类在适当的子类方法中使用协作者的方法。

您可能会对其目标是(来自维基百科)的Bridge pattern感兴趣:

  

桥接模式是软件工程中使用的设计模式   这意味着“将抽象与其实现分离出去   这两者可以独立变化“

答案 2 :(得分:0)

抽象方法的目的是强制你实现它们。

如果在超类中添加抽象方法,则必须重构代码并提供实现;即使使用默认实现,您的程序也会不一致 - 如果您需要返回自定义类型,该怎么办?我会花时间提供正确的实现,因为如果我添加它们,我可能需要调用这些方法。

答案 3 :(得分:0)

您可以使用基类中的新抽象方法派生一个新的抽象类。派生具有来自这个新类的新方法的具体类以及来自旧基类的其他类。

答案 4 :(得分:-1)

使你的公共BaseFragment类抽象

 public abstract class Fragment_Music extends BaseFragment{
              @Override
protected boolean postExec() {
    return false;
} 

    }