Составное наследование: как назначить конечное поле в конструкторе подкласса, который зависит от значения 'this' (обратная ссылка)?

Я использую составные классы для группировки функций.
Но класс A (с композитом A1) получил наследование B (с композитом B1), и поведение, существующее в A1, будет адаптировано к B1, но окончательный a1 должен быть экземпляром B1 для этого.

Обь.: У меня есть способы, чтобы убедиться, что составная копия выполняется правильно (только ее составным партнером).

Невозможно назначить объект B1 для конечного поля a1:

class finalFieldTestFails{
    class A1{
      A1(A a){}
    }

    class A{
      protected final A1 a1;
      A(){
        this.a1 = new A1(this);
      }

      A(A1 a1){
        this.a1 = a1;
      }
    }

    class B1 extends A1{
      B1(B b){
        super(b);
      }
    }

    class B extends A{
        //B(){ super.a1=new B1(this); } //FAIL: cant change final value
        //B(){super(new B1(this));} //FAIL: cant use 'this' or 'super'
    }
}

PS: ответ не должен включать рефлексивные трюки безопасности, если это возможно.

Ответ 1

B() {super.a1 = новый B1 (это); }//FAIL: изменение конечного значения can not

Вы не можете назначать значения уже назначенным конечным переменным, вы можете создать экземпляр внутри конструктора, но не как следующий.

B() {супер (новый B1 (этот));}//FAIL: can not use 'this' или 'super'

Вы можете использовать это, как только экземпляр будет создан только. Поскольку существует дерево наследования, оно не полностью создано, поэтому компилятор жалуется,

не может ссылаться на это, прежде чем конструктор супертипа был вызван

Ответ 2

С этот совет, данный @KevinHooke, я нашел этот ответ, и я пришел с этим кодом ниже.

Но имейте в виду, что этот вариант, который я выбрал может вызвать проблемы.

Итак, я закончил использование метода overriden для создания экземпляра типа "1", позволяя суперклассию выполнять задание.

class finalFieldTestWorks{
    class A1{A1(A a){}}

    class A{
      protected final A1 a1;
      A(){
        this.a1=new1();
      }
      protected A1 new1(){return new A1(this);}
    }

    class B1 extends A1{B1(B b){super(b);}}

    class B extends A{
      B(){
        super();
      }
      @Override
      protected B1 new1(){return new B1(this);}
    }
}

PS: Другие советы/обходные пути будут оценены.