为了验证,重写mutator方法

时间:2013-07-30 01:35:29

标签: java oop inheritance polymorphism mutators

我目前正在开发一个面向对象的设计项目,并且想知道是否有更好的方法来验证子类的mutators中的数据。

例如,我有一个带有子类Apartment,Condo和House的Home类。在Home类中,我想包含子类共享的(私有)字段的mutator。说其中一个字段是squareFootage。有没有办法让Home中的mutator足够通用,以便子类可以为squareFootage设置自己的有效值,而不必完全覆盖mutator?也就是说,我希望每个子类的squareFootage有不同的有效范围。

我尝试在Home中设置可能的范围值,然后在子类中覆盖它们。不幸的是,Home中的mutator仍然从Home类中获取而不是子类。

所以,我已经使用了mutator的摘要,但不幸的是,这导致了很多重复的代码,因为我可以在每个子类中复制并粘贴mutator。

如果可能的话,我想让可能的范围值保持静态,我理解这可能是通过反射实现的,但我真的很想避免在这个项目中使用它。

3 个答案:

答案 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;
    }
}