Menu
Coddy logo textTech

Конструктор по умолчанию

Часть раздела Объектно-ориентированное программирование путешествия по 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); // Использует параметризованный конструктор

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

challenge icon

Задание

Легко

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

Вы создадите два файла для организации вашего кода:

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

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

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