强制重写非抽象方法
Force non-abstract method to be overridden
我在摘要 class 中有一个方法 String foo()
,它已经进行了一些预计算,但无法提供该方法应该 return 的最终结果。所以我想要的是每个从我的抽象 class 继承的非抽象 class 必须以首先调用 super()
然后计算结果的方式实现 foo
.有没有办法在 java 中强制执行此操作?
是的,通过重新设计以使用 template method pattern 并包含一个抽象方法:
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);
}
我在摘要 class 中有一个方法 String foo()
,它已经进行了一些预计算,但无法提供该方法应该 return 的最终结果。所以我想要的是每个从我的抽象 class 继承的非抽象 class 必须以首先调用 super()
然后计算结果的方式实现 foo
.有没有办法在 java 中强制执行此操作?
是的,通过重新设计以使用 template method pattern 并包含一个抽象方法:
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);
}