Menu
Coddy logo textTech

Переопределение toString()

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

Когда вы выводите объект в Dart, вы можете увидеть что-то вроде Instance of 'Person' — это не очень информативно. Это происходит потому, что каждый класс наследует стандартный метод toString() от Object, который возвращает только имя класса.

Переопределив toString(), вы можете предоставить осмысленное строковое представление ваших объектов:

class Person {
  String name;
  int age;
  
  Person(this.name, this.age);
  
  @override
  String toString() {
    return 'Person(name: $name, age: $age)';
  }
}

void main() {
  var person = Person('Alice', 30);
  print(person);  // Person(name: Alice, age: 30)
}

Без переопределения print(person) выведет Instance of 'Person'. С ним вы получите полезную информацию о состоянии объекта.

Метод toString() вызывается автоматически всякий раз, когда Dart необходимо преобразовать ваш объект в строку — в инструкциях print(), интерполяции строк или при конкатенации с другими строками:

var message = 'User: $person';  // toString() вызывается автоматически
print('Found: ' + person.toString());  // Явный вызов

Хорошо реализованный toString() значительно упрощает отладку, позволяя быстро проверять значения объектов в процессе разработки.

challenge icon

Задание

Легко

Давайте создадим систему каталога товаров, где каждый товар отображает свою информацию в чистом, читаемом формате при выводе на печать. Вы попрактикуетесь в переопределении метода toString(), чтобы сделать ваши объекты более удобными для отладки и использования.

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

  • product.dart: Создайте класс Product, который представляет товар в магазине. Ваш товар должен иметь name (String), price (double) и quantity (int). Переопределите метод toString(), чтобы он возвращал отформатированную строку именно в таком формате: Product(name: [name], price: $[price], qty: [quantity])
  • main.dart: Импортируйте файл с товаром и продемонстрируйте, как переопределение toString() делает печать объектов гораздо более полезной. Создайте три товара и распечатайте их, чтобы увидеть ваше пользовательское строковое представление в действии:
    • Товар с именем 'Laptop', ценой 999.99 и количеством 5
    • Товар с именем 'Mouse', ценой 29.5 и количеством 50
    • Товар с именем 'Keyboard', ценой 75.0 и количеством 30
    Также продемонстрируйте интерполяцию строк, распечатав сообщение, включающее один из ваших товаров: Featured: [product], используя товар Laptop.

Обратите внимание, как печать каждого товара напрямую показывает значимую информацию вместо малополезного сообщения Instance of 'Product'. Ваш метод toString() вызывается автоматически как в операторах print(), так и при использовании интерполяции строк.

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

Product(name: Laptop, price: $999.99, qty: 5)
Product(name: Mouse, price: $29.5, qty: 50)
Product(name: Keyboard, price: $75.0, qty: 30)
Featured: Product(name: Laptop, price: $999.99, qty: 5)

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

import 'product.dart';

void main() {
  // TODO: Создайте три экземпляра Product:
  // 1. Laptop - price: 999.99, quantity: 5
  // 2. Mouse - price: 29.5, quantity: 50
  // 3. Keyboard - price: 75.0, quantity: 30

  // TODO: Выведите каждый продукт (toString() будет вызван автоматически)

  // TODO: Выведите сообщение о рекомендуемом товаре, используя интерполяцию строк
  // Формат: Featured: [laptop product]
}
quiz iconПроверьте себя

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

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