我有一个基类C
,其中包含字段X
、Y
和Z
。
C1
扩展了C
并且具有额外的字段T
。
在C1
构造函数中,我确实使用字段X
、Y
和Z
的一些硬编码值来调用super(C
)构造函数。然后我设置了T
。
是否有任何模式可以通过在C
构造函数中执行某些操作来自动验证C1
的所有字段?因此,我试图将自动验证推送到基类。
请注意,调用超级构造函数应该在C1
构造函数中的任何语句之前完成。我从一些抽象的validate()
方法开始,但我不是。我走在正确的轨道上。
谢谢。
原则上,C不应该知道C1的属性,因为C1是C的特殊化。然而,您可以在C中创建一个抽象的validate()方法,该方法必须由C1实现。然后,在C的构造函数中,您可以调用抽象方法。由于C1必须实现validate(),因此可以在那里添加其属性/字段验证。
尽管它违反了所有OO原则,但您可以利用Java的反射属性。通过反射,您可以发现类具有哪些方法和字段。因此,您可以将子类对象传递给基类,基类可以检查所有字段并验证它们。如果在子类构造函数的末尾执行此操作,则可以让验证方法返回一个值来查看这些值是否有效。
我想声明的是,我认为这不是正确的方法,但它应该在
我认为超级类应该验证自己。一个对象需要强制执行它自己的契约。对C值的任何验证都应该在它自己的构造函数中完成。同样,子类应该验证自己。
public class A {
private int x;
public A(int x) {
if (x < 0) throw new IllegalArgumentException("x cannot be negative");
this.x = x;
}
}
public class B extends A {
private String y;
public B(int x, String y) {
super(x);
if (y == null) throw new IllegalArgumentException("y cannot be null");
this.y = y;
}
}
class C{
Object x, y, z;
public C(Object x, Object y, Object z){
this.x = x;
this.y = y;
this.z = z;
}
public boolean validate(){ /**do stuff**/}
}
class D{
public D(/**args**/){
super(/**args**/);
if(validate()){
/**do stuff**//
}
}
}