我的基类C
包含字段X
,Y
和Z
。
C1
扩展C
并且有一个额外字段T
。
在C1
构造函数中,我确实将超级(C
)构造函数称为字段X
,Y
和Z
的一些硬编码值。然后我设置T
。
是否有任何模式可以通过在C1
构造函数中执行某些操作来自动验证C
的所有字段?所以我试图将自动验证推送到基类。
请注意,调用超级构造函数应该在C1
构造函数中的任何语句之前完成。我从一些抽象的validate()
方法开始,但我不是在正确的轨道上。
感谢。
答案 0 :(得分:2)
原则上,C不应该知道C1的属性,因为C1是C的特化。但是,你可以做的是在C中创建一个抽象的validate()方法,它必须由C1实现。然后,在C的构造函数中,您可以调用抽象方法。因为,C1必须实现validate(),然后可以在那里添加它的属性/字段验证。
答案 1 :(得分:1)
虽然它违反了所有OO原则,但您可以利用Java的反射属性。通过反射,您可以找出一个类有哪些方法和字段。因此,您可以将子类对象传递给基类,基类可以检查所有字段并验证它们。如果在子类构造函数的末尾执行此操作,则可以让验证方法返回一个值以查看值是否有效。
我想声明我认为这不是正确的方法,但应该有效
答案 2 :(得分:0)
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**//
}
}
}
答案 3 :(得分:0)
我会说超级类应该验证自己。对象需要强制执行自己的合同。 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;
}
}