java - 如何强制覆盖方法并同时调用 super

标签 java

好吧,最近我想实现以下内容

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/

相关文章:

java - Android RelativeLayout.LayoutParams 无法转换为 AbsListview.LayoutParams(错误低于 4.4.4)在 5.0 和 6.0.1 上工作正常

java - 如何使用 Spring Data 更新 Mongodb 中的整数数组元素?

java - 数据未出现在 javafx TableView 中

java - 俱乐部成员(member)系统数据库需要哪些表?

java - 直接访问嵌入式缓存 HSQLDB 服务器?

java - 覆盖父类的特定行

java - 在没有软件更新程序的 Mac 上安装 Java SE 6

java - 为什么我收到警告(453) Cant apply (char *STRING, int LENGTH) no typemaps are Defined

java - 从 PostgreSQL 流式传输行(带获取大小)

java - 如何在编辑期间获取 JTable 单元格的值