我目前正在开发一个面向对象的设计项目,并且想知道是否有更好的方法来验证子类的mutators中的数据。
例如,我有一个带有子类Apartment,Condo和House的Home类。在Home类中,我想包含子类共享的(私有)字段的mutator。说其中一个字段是squareFootage。有没有办法让Home中的mutator足够通用,以便子类可以为squareFootage设置自己的有效值,而不必完全覆盖mutator?也就是说,我希望每个子类的squareFootage有不同的有效范围。
我尝试在Home中设置可能的范围值,然后在子类中覆盖它们。不幸的是,Home中的mutator仍然从Home类中获取而不是子类。
所以,我已经使用了mutator的摘要,但不幸的是,这导致了很多重复的代码,因为我可以在每个子类中复制并粘贴mutator。
如果可能的话,我想让可能的范围值保持静态,我理解这可能是通过反射实现的,但我真的很想避免在这个项目中使用它。
答案 0 :(得分:1)
我认为可以通过添加一个必须在子类中实现的抽象“验证器”方法来实现,如下所示:
public class Home {
private float squareFootage;
public abstract void validateSquareFootage() throws MyValidationException; // you could throw an exception, runtime exception or return a boolean to indicate if value is valid or not
public void setSquareFootage(float squareFootage) {
validateSquareFootage(squareFootage); // again, throws exception or returns boolean, up to you
this.squareFootage = squareFootage;
}
// ... rest of implementation
}
在亚细胞酶中:
public class Condo extends Home {
@Override
public void validateSquareFootage(float squareFootage) throws MyValidationException {
// ... do validations
}
}
并且您根本不必覆盖mutator,只需实现正确的验证器。
答案 1 :(得分:0)
最好使Home类成为一个抽象类,并在子类中进行扩展。这样你就可以在home类中创建对所有子类都适用的方法,但你可以在子类中重写它们
答案 2 :(得分:0)
如果我理解你的问题,我想你想要这样的东西?
abstract class Home<T>{
protected T squareFootage;
abstract void setSquareFootage(T t);
}
class Apartment extends Home<String>{
@Override void setSquareFootage(String t) {
//...do something about the parameter
this.squareFootage = t;
}
}
class Condo extends Home<Integer>{
@Override void setSquareFootage(Integer t) {
//...do something about the parameter
this.squareFootage = t;
}
}
class House extends Home<Boolean>{
@Override void setSquareFootage(Boolean t) {
//...do something about the parameter
this.squareFootage = t;
}
}