21

假设我们有一个基类:

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

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

4

5 回答 5

43

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

做这样的事情会缓解你的编译问题,尽管它在没有覆盖的情况下使用时显然会抛出异常:

public abstract class BaseFragment extends Fragment {
    protected boolean doSomethingNew() {
        throw new NotImplementedException("method not overridden");
    }
}
于 2012-09-27T11:34:51.187 回答
2

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

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

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

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

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

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

于 2012-09-27T11:44:34.080 回答
0

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

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

于 2012-09-27T11:35:12.387 回答
0

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

于 2012-09-27T11:50:40.900 回答
-1

使您的公共 BaseFragment 类抽象

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

    }
于 2012-09-27T11:32:24.683 回答