【发布时间】:2018-02-04 13:29:03
【问题描述】:
我有一个问题可能很简单,但我找不到出路。
这里是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类中使用构建器,因为它会导致存储库中的太多变化。我还能尝试什么? - 这是一个最小的示例,实际的类很复杂,有几个参数。
【问题讨论】:
-
super(a, new ClassBC(c).getB())? -
ClassBC中的b来自哪里? -
@JoeC 我不能这样做,让我编辑我的问题以澄清它。
-
能否再添加一个构造函数:
Parent (A a)? -
从技术上讲,我可以做到这一点,但如果没有'B',一些功能将无法工作。你会推荐使用
Parent (A a),然后在Child的构造函数中,我做类似的事情:setB(b)。可能,这不是一个好主意,因为,我会暴露别人犯错误。
标签: java inheritance subclass superclass