Именованные конструкторы
Часть раздела Объектно-ориентированное программирование путешествия по 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 и помогает создавать самодокументируемый код.
Задание
ЛегкоДавайте создадим конвертер температуры, который продемонстрирует возможности именованных конструкторов. Вы создадите класс 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() для каждой температуры по порядку
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
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
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий