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, 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)

Шпаргалка

По умолчанию при выводе объекта в Dart отображается Instance of 'ClassName'. Переопределите метод toString(), чтобы предоставить осмысленное строковое представление:

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

Метод toString() вызывается автоматически в инструкциях print() и при интерполяции строк:

var person = Person('Alice', 30);
print(person);  // Person(name: Alice, age: 30)
var message = 'User: $person';  // toString() called automatically

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

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Проверьте себя

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

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