Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 强制重写非抽象方法_Java_Abstract Class - Fatal编程技术网

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
作为“实现”方法的后缀,但这并不一定普遍。不,您不能禁止从实现类中调用抽象方法,我认为您不应该这样做。实现类正在提供代码——为什么它不能调用它呢?