Списки инициализации
Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 12 из 110.
Список инициализации — это код, который указывается после двоеточия в конструкторе перед телом конструктора. Он выполняется до выполнения тела конструктора и используется для инициализации переменных экземпляра.
Вы уже видели списки инициализации в предыдущих уроках:
Point.origin() : x = 0, y = 0;Часть после двоеточия (x = 0, y = 0) — это список инициализации. Несколько инициализаций разделяются запятыми.
Списки инициализации необходимы при работе с переменными final, которые должны быть установлены до выполнения тела конструктора:
class Circle {
final double radius;
final double area;
Circle(double r)
: radius = r,
area = 3.14159 * r * r;
}
Circle c = Circle(5);
print(c.radius); // 5.0
print(c.area); // 78.53975Список инициализации также может выполнять вычисления или преобразования над параметрами конструктора перед их присвоением. Это полезно, когда вам нужно вычислить производные значения или проверить данные во время создания объекта.
Вы можете комбинировать сокращенный синтаксис this. со списком инициализации:
class Rectangle {
final double width;
final double height;
final double area;
Rectangle(this.width, this.height)
: area = width * height;
}
Rectangle rect = Rectangle(4, 5);
print(rect.area); // 20.0Здесь width и height присваиваются через сокращенную запись, в то время как area вычисляется в списке инициализации с использованием этих значений.
Задание
ЛегкоДавайте создадим калькулятор размеров коробки, который использует списки инициализации для вычисления производных значений при создании объектов.
Вы организуете свой код в двух файлах:
box.dart: Определите классBox, который представляет трехмерную коробку с размерами и автоматически вычисляемыми свойствами. Ваш класс должен иметь:- Три поля
final double:length,widthиheight - Два вычисляемых поля
final double:volumeиsurfaceArea - Конструктор, который принимает
length,widthиheight, используя сокращенную записьthis., и использует список инициализации для вычисленияvolume(length × width × height) иsurfaceArea(2 × (length×width + width×height + height×length)) - Метод
display(), который выводит информацию о коробке
- Три поля
main.dart: Импортируйте ваш класс коробки и создайте две коробки:- Коробку с размерами
3.0,4.0,5.0 - Коробку с размерами
2.0,2.0,2.0
display()для каждой коробки в указанном порядке.- Коробку с размерами
Метод display() должен выводить данные именно в таком формате:
Box: [length]x[width]x[height] | Volume: [volume] | Surface: [surfaceArea]Ожидаемый вывод:
Box: 3.0x4.0x5.0 | Volume: 60.0 | Surface: 94.0
Box: 2.0x2.0x2.0 | Volume: 8.0 | Surface: 24.0Шпаргалка
Список инициализации — это код, который указывается после двоеточия в конструкторе перед телом конструктора. Он выполняется до выполнения тела конструктора и используется для инициализации переменных экземпляра.
Базовый синтаксис с несколькими инициализациями, разделенными запятыми:
Point.origin() : x = 0, y = 0;Списки инициализации необходимы для final переменных, которые должны быть установлены до выполнения тела конструктора:
class Circle {
final double radius;
final double area;
Circle(double r)
: radius = r,
area = 3.14159 * r * r;
}Вы можете комбинировать сокращенный синтаксис this. со списком инициализации, чтобы напрямую присваивать значения одним полям и вычислять другие:
class Rectangle {
final double width;
final double height;
final double area;
Rectangle(this.width, this.height)
: area = width * height;
}Список инициализации может выполнять вычисления или преобразования параметров конструктора перед их присвоением, что полезно для получения производных значений при создании объекта.
Попробуйте сами
import 'box.dart';
void main() {
// TODO: Создайте коробку с размерами 3.0, 4.0, 5.0
// TODO: Создайте коробку с размерами 2.0, 2.0, 2.0
// TODO: Вызовите display() для каждой коробки по порядку
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыБиблиотеки и импортВведение в ООПКлассы и объектыКлючевое слово thisМетодыПеременные экземпляраОсновы конструкторовИтоги — Простой калькулятор4Null-безопасность
Введение в Null-безопасностьNullable и Non-Nullable типыОператоры ? и !Ключевое слово Late и Null-безопасностьNull-aware операторыNull-безопасность в классахИтоги — Система профилей пользователей7Абстрактные классы и интерфейсы
Абстрактные классыАбстрактные методыИнтерфейсы в DartНеявные интерфейсыРеализация против наследованияМножественные интерфейсыИтоги — Калькулятор фигур10Коллекции и обобщения
Обзор List, Set, MapТипобезопасные коллекцииОбобщенные классыОбобщенные методыОграничения обобщенийIterable и IteratorИтоги: Обобщенное хранилище13Продвинутые концепции ООП
Композиция против наследованияМетоды расширенияВызываемые классыЗапечатанные классы (Dart 3)Записи (Dart 3)Паттерны и сопоставление (3.0)Перечисления с методами16Проект: Управление библиотекой
Обзор проектаКлассы Book и User2Конструкторы в Dart
Конструктор по умолчаниюИменованные конструкторыСписки инициализацииКонстантные конструкторыФабричные конструкторыПеренаправляющие конструкторыИтоги — Shape Builder5Инкапсуляция
Публичные и приватные членыСоглашение о префиксе _Приватность на уровне библиотекГеттеры и сеттеры: подробный разборСкрытие данныхИтоги — Записи о студентах8Mixins
Введение в MixinsСоздание MixinsИспользование нескольких MixinsКлючевое слово on в MixinsMixin и наследованиеMixin и интерфейсИтоги: Система животных11Специальные методы
Переопределение toString()Переопределение hashCode и ==Интерфейс ComparableМетод call()Переопределение noSuchMethodПовторение — Пользовательская коллекция14Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy3Свойства классов
Члены экземпляра и статические членыПоля Final и ConstПеременные LateСтатические методы и поляГеттеры и сеттерыИтоги — Менеджер банковского счета6Наследование
Основы наследованияКлючевое слово superПереопределение методовАннотация @overrideКлючевое слово final для классовКонструкторы и наследованиеИтоги: Иерархия сотрудников9Полиморфизм
Основы полиморфизмаПолиморфизм через интерфейсыПроверка типов во время выполненияОператоры is и asКлючевое слово covariantИтоги — Обработчик платежей12Асинхронное ООП
Futures и async/awaitОсновы StreamsКонтроллеры StreamАсинхронные конструкторыАсинхронность в методах классовИтоги — Data Fetcher15Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий