Почему поле экземпляра нельзя передать суперклассу? - PullRequest
0 голосов
/ 06 августа 2020
class A {
  A(int a);
}

class B extends A {
  final int b;

  B(int passed)
      : b = passed * 10,
        super(b); // Error
}

Как передать значение b конструктору суперкласса?

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Вы не можете передать поле в конструктор суперкласса, потому что поле не существует до завершения всех инициализаторов конструктора (поскольку объект еще не существует).

Если вы хотите ввести имя для промежуточного значения, чтобы вы могли ссылаться на него дважды, вы можете использовать промежуточный конструктор:

class B {
  final int b;
  B(int passed) : this._(passed * 10);
  B._(this.b) : super(b);
}

Это делает конструктор B генеративным конструктором пересылки, что позволяет ему оценивать выражения и передавать результаты другому генеративному конструктору. Это единственный способ дать имя промежуточному значению во время инициализации конструктора.

0 голосов
/ 06 августа 2020

Списки инициализации не имеют доступа для чтения к переменным экземпляра.

В простом примере, подобном приведенному вами, вы можете просто использовать passed * 10 вместо b

Для однако для более сложных вычислений вы можете перейти к конструктору фабрики

class A {
  final int a;
  A(this.a);
}

class B extends A {
  final int b;

  factory B(int passed){
    var calculated;
    
    // some complicated calculation
    calculated= passed * 10;
    
    return B._(passed, calculated);
  }
  
  B._(int passed, int calculated)
    : b = passed,
    super(calculated);
}

main() {
  var b = B(2);
  print (b.a);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...