重写 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() 能让你在开发过程中快速查看对象的值,从而更轻松地进行调试。
挑战
简单我们来构建一个产品目录系统,让每个产品在打印时都能以清晰易读的格式显示信息。你将练习重写 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的产品
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 产品]
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Dart 在线编译器