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

2022-09-02 00:49:13

假设我们有一个基类:

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 会立即显示错误,要求在已派生的类中实现此新方法。

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


答案 1

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

做这样的事情可以缓解你的编译问题,尽管它显然会在使用时引发异常而不覆盖:

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

答案 2

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

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

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

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

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

桥接模式是软件工程中使用的一种设计模式,旨在“将抽象与其实现分离,以便两者可以独立变化”