好吧,最近我想实现以下内容
public enum ObjectTypes {
STRING,
INTEGER
}
interface IObjectEnhancer{
void enhance(String s);
void enhance(Integer i);
ObjectTypes getLastEnhancedType();
}
class ObjectEnhancer implements IObjectEnhancer{
ObjectTypes lastUsedType=null;
@CallSuper
@Override
public void enhance(String s) {
this.lastUsedType=ObjectTypes.STRING;
}
@CallSuper
@Override
public void enhance(Integer i) {
this.lastUsedType=ObjectTypes.INTEGER;
}
@Override
final public ObjectTypes getLastEnhancedType() {
return lastUsedType;
}
}
class ObjectEnhancerChild extends ObjectEnhancer{
@Override
public void enhance(String s) {
super.enhance(s);
//child code
}
@Override
public void enhance(Integer i) {
super.enhance(i);
//child code
}
}
为了安全起见,我想添加 @CallSuper
因为我真的希望只有父级记住类型,但我也想要 enhance(String)
和 增强(Integer)
成为抽象
,这样以后笨手笨脚的人(包括我)就不会忘记实际实现这些方法。
所以下面是一种处理这种情况的方法,显然只有我有这种情况,而互联网上并没有真正的建议,担心这么小的事情可能看起来很愚蠢,但如果你有 10 多种方法星星变成噩梦(欢迎反馈和其他解决方案):
最佳答案
只需创建新的 abstract
方法,以便子级方法强制实现它们,并且父级方法调用 abstract
方法,而不是使用 @CallSuper
:
abstract class ObjectEnhancer implements IObjectEnhancer{ //add abstract to parent
ObjectTypes lastUsedType=null;
abstract void enhance2(String s); //new
abstract void enhance2(Integer i); //new
//removed @CallSuper
@Override
final public void enhance(String s) { //changed to final
this.lastUsedType=ObjectTypes.String;
enhance2(s); //new
}
//removed @CallSuper
@Override
final public void enhance(Integer i) { //changed to final
this.lastUsedType=ObjectTypes.Integer;
enhance2(i); //new
}
@Override
final public ObjectTypes getLastEnhancedType() {
return lastUsedType;
}
}
class ObjectEnhancerChild extends ObjectEnhancer{
@Override
public void enhance2(String s) { //changed to abstract method
//removed super.enhance(s);
//code
}
@Override
public void enhance2(Integer i) { //changed to abstract method
//removed super.enhance(i);
//code
}
}
关于java - 如何强制覆盖方法并同时调用 super,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54826222/