Menu
Coddy logo textTech

Списки инициализации

Часть раздела Объектно-ориентированное программирование путешествия по 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 вычисляется в списке инициализации с использованием этих значений.

challenge icon

Задание

Легко

Давайте создадим калькулятор размеров коробки, который использует списки инициализации для вычисления производных значений при создании объектов.

Вы организуете свой код в двух файлах:

  • 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() для каждой коробки по порядку
  
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование