Menu
CoddyTech

重写 toString()

本课属于 Coddy Dart 学习旅程的“面向对象编程”单元。第 70 课,共 110 课。

在 Dart 中打印对象时,你可能会看到类似 Instance of 'Person' 的内容,这不太有用。这是因为每个类都会从 Object 继承一个默认的 toString() 方法,而它只会返回类名。

通过重写 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'。重写后,你就能获取有关对象状态的实用信息。

每当 Dart 需要将对象转换为字符串时,都会自动调用 toString() 方法,例如在 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() 如何让打印对象变得更有用。创建 3 个产品并打印出来,查看自定义字符串表示的效果:
    • 名称为 'Laptop'、价格为 999.99、数量为 5 的产品
    • 名称为 'Mouse'、价格为 29.5、数量为 50 的产品
    • 名称为 'Keyboard'、价格为 75.0、数量为 30 的产品
    还要通过打印一条包含其中一个产品的消息,演示字符串插值:使用 Laptop 产品,格式为 Featured: [product]。

请注意,直接打印每个产品时,会显示有意义的信息,而不是毫无帮助的 Instance of 'Product' 消息。在 print() 语句中以及使用字符串插值时,都会自动调用 toString() 方法。

预期输出:

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: 创建 3 个 Product 实例:
  // 1. Laptop,价格:999.99,数量:5
  // 2. Mouse,价格:29.5,数量:50
  // 3. Keyboard,价格:75.0,数量:30

  // TODO: 打印每个产品(会自动调用 toString())

  // TODO: 使用字符串插值打印一条推荐消息
  // 格式:Featured: [laptop 产品]
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Dart 在线编译器