Конструктор по умолчанию
Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 10 из 110.
Когда вы не определяете ни одного конструктора в классе, Dart автоматически предоставляет конструктор по умолчанию. Это конструктор без параметров, который просто создает экземпляр класса.
class Book {
String title = 'Unknown';
int pages = 0;
}
// Dart предоставляет конструктор по умолчанию: Book()
Book myBook = Book();
print(myBook.title); // UnknownКонструктор по умолчанию невидим в вашем коде, но он существует. Он не принимает аргументов и инициализирует объект теми значениями по умолчанию, которые вы присвоили переменным экземпляра.
Как только вы определяете свой собственный конструктор, конструктор по умолчанию больше не предоставляется автоматически. Если вам все еще нужен конструктор без аргументов наряду с параметризованным, вы должны создать его явно:
class Book {
String title;
int pages;
// Явный конструктор по умолчанию
Book() : title = 'Unknown', pages = 0;
// Параметризованный конструктор
Book.withDetails(this.title, this.pages);
}
Book book1 = Book(); // Использует конструктор по умолчанию
Book book2 = Book.withDetails('Dart', 300); // Использует параметризованный конструкторЯвный конструктор по умолчанию использует список инициализации (часть после двоеточия) для установки начальных значений. Этот паттерн полезен, когда вы хотите предложить несколько способов создания объектов одного и того же класса.
Задание
ЛегкоДавайте создадим простую систему инвентаризации товаров, которая демонстрирует использование как неявных, так и явных конструкторов по умолчанию.
Вы создадите два файла для организации вашего кода:
product.dart: Определите классProduct, который предлагает два способа создания товаров:- Явный конструктор по умолчанию
Product(), который инициализируетnameзначением'Unnamed'иpriceзначением0.0, используя список инициализации - Именованный конструктор
Product.withDetails, который принимает параметрыnameиprice - Метод
display(), который выводит:Product: [name] - $[price]
- Явный конструктор по умолчанию
main.dart: Импортируйте ваш класс продукта и создайте два товара:- Один с использованием конструктора по умолчанию
- Другой с использованием именованного конструктора с
'Laptop'и999.99
display()для каждого товара.
Ваш класс Product должен иметь две переменные экземпляра:
String namedouble price
Ожидаемый формат вывода:
Product: Unnamed - $0.0
Product: Laptop - $999.99Шпаргалка
Когда в классе не определен ни один конструктор, Dart автоматически предоставляет конструктор по умолчанию без параметров:
class Book {
String title = 'Unknown';
int pages = 0;
}
Book myBook = Book(); // Uses implicit default constructor
print(myBook.title); // UnknownКак только вы определяете свой собственный конструктор, конструктор по умолчанию больше не предоставляется автоматически. Чтобы иметь одновременно конструктор без аргументов и параметризованный конструктор, вы должны создать их явно:
class Book {
String title;
int pages;
// Explicit default constructor with initializer list
Book() : title = 'Unknown', pages = 0;
// Named constructor
Book.withDetails(this.title, this.pages);
}
Book book1 = Book(); // Uses default
Book book2 = Book.withDetails('Dart', 300); // Uses named constructorЯвный конструктор по умолчанию использует список инициализации (после двоеточия) для установки начальных значений.
Попробуйте сами
import 'product.dart';
void main() {
// TODO: Создайте продукт, используя конструктор по умолчанию
// TODO: Создайте продукт, используя именованный конструктор с 'Laptop' и 999.99
// 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
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий