Menu
Coddy logo textTech

Именованные конструкторы

Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 11 из 110.

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

Синтаксис использует имя класса, за которым следует точка и имя конструктора:

class Point {
  int x;
  int y;

  // Обычный конструктор
  Point(this.x, this.y);

  // Именованный конструктор для начальной точки
  Point.origin() : x = 0, y = 0;

  // Именованный конструктор из одного значения
  Point.diagonal(int value) : x = value, y = value;
}

Каждый именованный конструктор предоставляет понятный и читаемый способ создания объектов:

Point p1 = Point(3, 5);
Point p2 = Point.origin();
Point p3 = Point.diagonal(10);

print('p1: (${p1.x}, ${p1.y})'); // p1: (3, 5)
print('p2: (${p2.x}, ${p2.y})'); // p2: (0, 0)
print('p3: (${p3.x}, ${p3.y})'); // p3: (10, 10)

Именованные конструкторы делают ваш код более выразительным. Вместо того чтобы гадать, что означает Point(0, 0), Point.origin() сразу передает намерение. Этот паттерн часто встречается в библиотеках Dart и помогает создавать самодокументируемый код.

challenge icon

Задание

Легко

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

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

  • temperature.dart: Определите класс Temperature с переменной экземпляра double celsius. Ваш класс должен предоставлять три способа создания температуры:
    • Обычный конструктор Temperature(this.celsius), который принимает значение в градусах Цельсия напрямую
    • Именованный конструктор Temperature.fromFahrenheit, который принимает значение в Фаренгейтах и преобразует его в Цельсии по формуле: (fahrenheit - 32) * 5 / 9
    • Именованный конструктор Temperature.freezing(), который создает температуру в точке замерзания (0 градусов Цельсия)
    Добавьте метод display(), который выводит: [celsius]C
  • main.dart: Импортируйте ваш класс температуры и создайте три объекта температуры:
    • Один с использованием обычного конструктора со значением 25.0
    • Один с использованием fromFahrenheit со значением 98.6
    • Один с использованием freezing()
    Вызовите display() для каждой температуры в порядке, указанном выше.

Ожидаемый формат вывода:

25.0C
37.0C
0.0C

Шпаргалка

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

Синтаксис использует имя класса, за которым следует точка и имя конструктора:

class Point {
  int x;
  int y;

  // Обычный конструктор
  Point(this.x, this.y);

  // Именованный конструктор для начальной точки
  Point.origin() : x = 0, y = 0;

  // Именованный конструктор из одного значения
  Point.diagonal(int value) : x = value, y = value;
}

Использование именованных конструкторов:

Point p1 = Point(3, 5);
Point p2 = Point.origin();
Point p3 = Point.diagonal(10);

print('p1: (${p1.x}, ${p1.y})'); // p1: (3, 5)
print('p2: (${p2.x}, ${p2.y})'); // p2: (0, 0)
print('p3: (${p3.x}, ${p3.y})'); // p3: (10, 10)

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

Попробуйте сами

import 'temperature.dart';

void main() {
  // TODO: Создайте объект Temperature, используя обычный конструктор со значением 25.0
  
  // TODO: Создайте объект Temperature, используя fromFahrenheit со значением 98.6
  
  // TODO: Создайте объект Temperature, используя freezing()
  
  // TODO: Вызовите display() для каждой температуры по порядку
}
quiz iconПроверьте себя

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

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