我的 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/