子类

时间:2018-02-04 13:29:04

标签: java inheritance subclass superclass

我有一个问题可能很简单,但我找不到出路。

以下是ParentChild类,它们可以顺利运行。

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

问题在于:字段bc是其他类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类中使用构建器,因为它会导致存储库中的更改。我还能尝试什么?
  • 这是一个最小的例子,实际的类很复杂,还有几个参数。

2 个答案:

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