java - 如果基本方法失败,如何打破重写的方法?

标签 java oop

我的 Parent 类中有一个名为 validateData 的方法。在我的 Child 类中,我覆盖了该方法并添加了一些额外的功能。如果一切正常,我需要调用名为 sendData() 的方法。这是我的 Java 代码:

  public class Parent {

    protected int sum;
    protected double commission;

    protected void validateData() {
        if (!isSumWrittenCorrectly()) {
            return;
        }

        performData();
    }

    private boolean isSumWrittenCorrectly() {
        if (sum < 100) {
            return false;
        }

        return true;
    }


    protected void performData() {
        commission = sum * 0.02;
    }


}


class Child extends Parent {
    private String email;

    @Override
    protected void validateData() {
        super.validateData();

        if (!isEmailWrittenCorrectly()) {
            return;
        }

        performData();
    }

    @Override
    protected void performData() {
        super.performData();


        sendData(email, commission, sum);

    }
}

所以,问题是,即使sum可以写错,子类的performData还是可以调用的。如何防止这种情况?我有一个想法 validateData 需要返回 boolean 并且在我的子类中我检查了 super 关键字。但我认为这是个坏主意。那么,如果基方法失败,如何打破被覆盖的方法呢?

最佳答案

我建议你让你的 performData() 检查验证是否正常,这样会容易很多。您可能还希望使 performData() public 可以在类外访问。

public class Parent {

    protected int sum;
    protected double commission;

    protected boolean validateData() {
        return isSumWrittenCorrectly();
    }

    private boolean isSumWrittenCorrectly() {
        if (sum < 100) {
            return false;
        }
        return true;
    }

    protected void performData() {
        if(!validateData()) {
            return;
        }
        commission = sum * 0.02;
    }
}


class Child extends Parent {

    private String email;

    @Override
    protected boolean validateData() {
        if(!super.validateData()) {
            return false;
        }
        if (!isEmailWrittenCorrectly()) {
            return false;
        }
        return true;
    }

    @Override
    protected void performData() {
        super.performData();
        if(!validateData()) {
            return;
        }
        sendData(email, commission, sum);
    }
}

最后,在验证失败的情况下抛出异常也可能更容易,这将节省一些 true false 比较。

public class Parent {

    protected int sum;
    protected double commission;

    protected void validateData() {
        if(!isSumWrittenCorrectly()) {
            throw new IllegalArgumentException("sum is not correct");
        }
    }

    private boolean isSumWrittenCorrectly() {
        if (sum < 100) {
            return false;
        }
        return true;
    }


    protected boolean performData() {
        validateData();
        commission = sum * 0.02;
    }
}


class Child extends Parent {

    private String email;

    @Override
    protected boolean validateData() {
        super.validateData();
        if (!isEmailWrittenCorrectly()) {
            throw new IllegalArgumentException("email is not correct")
        }
    }

    @Override
    protected void performData() {
        validateData();
        super.performData();
        sendData(email, commission, sum);
    }
}

关于java - 如果基本方法失败,如何打破重写的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51261229/

相关文章:

oop - "Association end could be owned either by end classifier, or association itself"是什么意思?

java - 从子类对象使用父类(super class)的 getClass 方法

Java泛型类型比较

java - 初学者处理用户输入时的异常处理

oop - 如何在 DDD 中组合来自不同限界上下文的数据

c++ - 如何在工厂中为延迟实例化指定具体类/如何延迟构造函数调用

java - 通过 gremlin 服务器公开的 Titan 图的 ORM

java - jdk1.7.0.79 的 Ojdbc jar 版本

java - 在 UCS-2 Little Endian、Java 中写入文本文件

java - 代码效率、调试、对象方法、数组