假设我们有一个基类:
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会立即显示错误,要求在已派生的类中实现此新方法。
是否在基类中添加“默认”抽象方法,即使我们没有在派生类中实现它也不显示错误? (因为每次基类附加新方法时都需要花费大量时间来修复每个派生类。)
答案 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;
}
}