我有一个问题可能很简单,但我找不到出路。
以下是Parent
和Child
类,它们可以顺利运行。
public class Parent {
private A a;
private B b;
Parent (A a, B b){
this.a = a;
this.b = b;
}
public class A {}
public class B {}
private class C {}
public class Child extends Parent {
private final C c;
Child(A a, B b, C c,) {
super(a, b);
this.c = c;
}
}
}
问题在于:字段b
和c
是其他类ClassBC
的字段,ClassBC
是类Child
的参数之一。即,
public class Child extends Parent {
private D d;
Child(A a, C c) {
// I must call super(...) here; but can't do that without `b`
ClassBC classBC = new ClassBC(c);
B b = classBC.getB();
D d = classBC.getD();
}
// some methods
}
private class ClassBC{
private D d;
ClassBC(C c){
// do something here to get 'B' and 'D'
}
public D getd(){
return d;
}
public B getB(){
return b;
}
}
所以:
Parent
类中使用Builder,以便可以在Child
类的构造函数中使用它。正如预期的那样,它已编译但失败,因为Parent
类的字段在Child
类中不可用。Child
类中使用构建器,因为它会导致存储库中的更改。我还能尝试什么? 答案 0 :(得分:3)
不能用工厂方法做。使子构造函数为私有,并从此工厂方法添加静态方法createChild
创建子对象。
在调用Child构造函数之前创建ClassBC
对象。
答案 1 :(得分:2)
我认为这应该对你有用
public class Child extends Parent {
private D d;
private ClassBC bc;
Child(A a, C c) {
// Inline
this(a, new ClassBC(c));
}
Child(A a, ClassBC bc) {
super(a, bc.getB());
this.bc = bc;
this.d = bc.getD();
}
}