Java如何在抽象类中重写可选方法?

Java如何在抽象类中重写可选方法?,java,class,methods,abstract,Java,Class,Methods,Abstract,假设我们有一个基类: public abstract class BaseFragment extends Fragment { ... protected abstract boolean postExec(); ... } public abstract class BaseFragment extends Fragment { ... protected abstract boolean postExec(); protected abst

假设我们有一个基类:

public abstract class BaseFragment extends Fragment {
    ...
    protected abstract boolean postExec();
    ...
}
public abstract class BaseFragment extends Fragment {
    ...
    protected abstract boolean postExec();
    protected abstract boolean parseFileUrls();
    ...
}
然后从中派生出其他类(例如,Fragment\u Movie、Fragment\u Weather…)

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

public abstract class BaseFragment extends Fragment {
    ...
    protected abstract boolean postExec();
    ...
}
public abstract class BaseFragment extends Fragment {
    ...
    protected abstract boolean postExec();
    protected abstract boolean parseFileUrls();
    ...
}
Eclipse在请求在已经派生的类中实现此新方法时立即显示错误


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

将公共BaseFragment类抽象化

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

    }

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

这样做可以缓解编译问题,但在不重写的情况下使用时显然会引发异常:

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

抽象方法的目的是迫使您实现它们

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

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

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

因此,对于您的问题,您最终可以使用compositionover继承添加协作器(包含新的公共方法)作为基类的受保护字段

因此,不需要在具体类中实现任何东西,也不需要允许这些类在适当的子类方法中使用collaborator的方法

您可能对
桥接模式感兴趣,其目标是(来自维基百科):

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


您可以使用新的抽象方法从基类派生一个新的抽象类。从这个新类派生出应该有新方法的具体类,从旧基类派生出其他类。

从你的方法中删除你不想覆盖的'abstract'关键字,但这样就不可能创建
Fragment\u Music
@hage的对象。当然,我们不能实例化抽象类。但您始终可以创建子类的实例(实现这个Abstract类)并调用这些方法。我们不能吗?当然可以。我们可以实例化实现抽象方法的类。但是您将
Fragment\u Music
抽象化了,似乎这应该是“实现类”,即要实例化的类