Menu
CoddyTech

Ghi đè toString()

Thuộc phần Lập trình hướng đối tượng trong hành trình Dart của Coddy. Bài học 70 trên 110.

Khi in ra một đối tượng trong Dart, bạn có thể thấy nội dung như Instance of 'Person' - không hữu ích lắm. Điều này xảy ra vì mọi lớp đều kế thừa phương thức toString() mặc định từ Object, phương thức này chỉ trả về tên lớp.

Bằng cách ghi đè toString(), bạn có thể cung cấp biểu diễn chuỗi có ý nghĩa cho các đối tượng:

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

Nếu không ghi đè, print(person) sẽ in ra Instance of 'Person'. Khi ghi đè, bạn sẽ nhận được thông tin hữu ích về trạng thái của đối tượng.

Phương thức toString() được gọi tự động bất cứ khi nào Dart cần chuyển đổi đối tượng của bạn thành chuỗi, trong các câu lệnh print(), phép nội suy chuỗi hoặc khi nối với các chuỗi khác:

var message = 'User: $person';  // Tự động gọi toString()
print('Found: ' + person.toString());  // Gọi trực tiếp

Phương thức toString() được triển khai tốt giúp bạn gỡ lỗi dễ dàng hơn nhiều vì bạn có thể nhanh chóng kiểm tra giá trị của đối tượng trong quá trình phát triển.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống danh mục sản phẩm, trong đó mỗi sản phẩm hiển thị thông tin theo định dạng rõ ràng, dễ đọc khi in ra. Bạn sẽ luyện tập ghi đè phương thức (method) toString() để giúp đối tượng dễ gỡ lỗi và thân thiện hơn với người dùng.

Bạn sẽ sắp xếp code thành hai tệp:

  • product.dart: Tạo lớp Product đại diện cho một mặt hàng trong cửa hàng. Sản phẩm cần có name (String), price (double) và quantity (int). Ghi đè phương thức toString() để trả về một chuỗi được định dạng chính xác như sau: Product(name: [name], price: $[price], qty: [quantity])
  • main.dart: Nhập tệp sản phẩm và minh họa cách ghi đè toString() giúp việc in đối tượng hữu ích hơn nhiều. Tạo ba sản phẩm và in chúng ra để xem cách biểu diễn chuỗi tùy chỉnh hoạt động:
    • Một sản phẩm có tên 'Laptop', giá 999.99 và số lượng 5
    • Một sản phẩm có tên 'Mouse', giá 29.5 và số lượng 50
    • Một sản phẩm có tên 'Keyboard', giá 75.0 và số lượng 30
    Đồng thời minh họa phép nội suy chuỗi bằng cách in ra một thông báo có chứa một trong các sản phẩm: Featured: [product], sử dụng sản phẩm Laptop.

Hãy chú ý cách in trực tiếp từng sản phẩm sẽ hiển thị thông tin hữu ích thay vì thông báo không hữu ích Instance of 'Product'. Phương thức toString() tự động được gọi trong cả câu lệnh print() lẫn khi nội suy chuỗi.

Đầu ra dự kiến:

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)

Tự làm thử

import 'product.dart';

void main() {
  // TODO: Tạo ba instance của Product:
  // 1. Laptop, giá: 999.99, số lượng: 5
  // 2. Mouse, giá: 29.5, số lượng: 50
  // 3. Keyboard, giá: 75.0, số lượng: 30

  // TODO: In ra từng sản phẩm (toString() sẽ tự động được gọi)

  // TODO: In ra thông báo nổi bật bằng cách nội suy chuỗi
  // Định dạng: Featured: [sản phẩm laptop]
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Dart online