Java 强制重写非抽象方法
我在一个抽象类中有一个方法Java 强制重写非抽象方法,java,abstract-class,Java,Abstract Class,我在一个抽象类中有一个方法String foo(),这个抽象类已经进行了一些预计算,但无法提供该方法应该返回的最终结果。所以我想要的是,从我的抽象类继承的每个非抽象类都必须实现foo,首先调用super(),然后计算结果。有没有办法在java中强制实现这一点?是的,通过重新设计使用并包含一个抽象方法: public abstract class AbstractSuper { public final String foo() { // Maybe do somethin
String foo()
,这个抽象类已经进行了一些预计算,但无法提供该方法应该返回的最终结果。所以我想要的是,从我的抽象类继承的每个非抽象类都必须实现foo
,首先调用super()
,然后计算结果。有没有办法在java中强制实现这一点?是的,通过重新设计使用并包含一个抽象方法:
public abstract class AbstractSuper {
public final String foo() {
// Maybe do something before calling bar...
String initialResult = bar();
// Do something common, e.g. validation
return initialResult;
}
protected abstract String bar();
}
基本上,如果您想强制子类重写一个方法,它必须是抽象的——但不一定是由其他代码调用的方法……在Java中无法做到这一点。但是,您可以声明另一个抽象方法并调用它。像这样:
public final String foo() {
String intermediate = ... // calculate intermediate result;
return calculateFinalResult(intermediate);
}
protected abstract String calculateFinalResult(String intermediate);
这样,您将被迫覆盖calculateFinalResult
。不需要调用super
实例。另外,子类将无法重新定义您的foo()
,因为它被声明为final
类似的东西
public abstract class MyBean {
public final String foo(){
String preFinalResult = [...];
return doFinalResult(preFinalResult)
}
protected abstract String doFinalResult(String preFinal);
}
请共享foo的方法签名,让它调用需要执行最终计算或返回所需值的抽象方法。请注意:最好使用适当的修饰符排序(例如
受保护的和抽象的)。您可以在此处找到建议的排序:。最好将doFinalResult
的修饰符从public
更改为protected
,这样其他类(除了子类和同一包中的类)就不能直接访问它了。是否有关于如何调用这两个方法的约定?我会给他们起相同的名字(这当然是不可能的),因为基本上他们做相同的事情。@他们是吗?abstract
方法执行整个计算的不同部分,因此它应该有一个相应的名称。相同的名称可能会导致一些关于如何在子类中实现抽象方法的误解。@Tom是的,没错。它执行不同的部分。但我通常是根据方法返回的内容调用方法,而不是根据方法执行的操作调用方法。例如,在我当前的例子中,我只想计算方法调用的数量,因此我的foo
看起来像counter++;返回杆()代码>。顺便问一下:有可能禁止在实现抽象方法的类中调用抽象方法吗?@principal-ideal-domain:我有一个惯例,使用Impl
作为“实现”方法的后缀,但这并不一定普遍。不,您不能禁止从实现类中调用抽象方法,我认为您不应该这样做。实现类正在提供代码——为什么它不能调用它呢?