Как я могу инициализировать неизменяемые данные миксина в Dart? - PullRequest
0 голосов
/ 13 января 2019

Я программирую во Flutter, используя Dart 2.1.0, и сталкиваюсь с такой ситуацией:

mixin Salt {
  final int pinches;  // Immutable, and I want to delay initialization.

  // Cannot declare constructors for mixin
}

class Meat with Salt {
  Meat(int pinches) ... // How to initialize it?
}

Salt не имеет конструктора, поэтому я не могу использовать список инициализатора. pinches равно final, поэтому я не могу установить его в конструкторе Meat.

Я не хочу делать Salt классом, потому что Meat может потребоваться расширяться от чего-то другого.

И я хочу сохранить pinches неизменным.

Есть ли способ сделать это? Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 13 января 2019

По замыслу невозможно объявить последний элемент в mixin, потому что невозможно объявить конструктор для инициализации последнего члена, цитируя документы :

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

Компромисс может заключаться в объявлении частного члена и реализации только метода получения.
_pinches виден только внутри библиотеки, он доступен только для чтения пользователям библиотеки.

mixin Salt {
  int _pinches;

  get pinches => _pinches;

}

class Meat with Salt {

  Meat(int pinches)  {
   _pinches = pinches;
  }
}

Примечание : приведенный выше шаблон из-за правил видимости работает, только если mixin и смешанные классы находятся в одной библиотеке.

0 голосов
/ 13 января 2019

Вы можете изменить объявление вашего миксина на:

mixin Salt {
  int get pitches;
}

А затем определить поле внутри класса реализации

class Meat with Salt {
  final int pitches;
  Meat(this.pitches);
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...