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ếpPhươ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.
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ớpProductđạ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ứctoString()để 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.99và số lượng5 - Một sản phẩm có tên
'Mouse', giá29.5và số lượng50 - Một sản phẩm có tên
'Keyboard', giá75.0và số lượng30
Featured: [product], sử dụng sản phẩm Laptop.- Một sản phẩm có tên
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]
}
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
1Nền tảng về lập trình hướng đối tượng
Tệp bên ngoàiThư viện và câu lệnh importGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTừ khóa thisPhương thứcBiến thể hiệnKiến thức cơ bản về hàm khởi tạoÔn tập: Máy tính đơn giản4An toàn với giá trị null
Giới thiệu về an toàn với giá trị nullCó thể null và không thể nullToán tử ? và !Từ khóa late và an toàn với giá trị nullToán tử xử lý nullAn toàn với giá trị null trong lớpÔn tập: hệ thống hồ sơ người dùng7Lớp trừu tượng và interface
Lớp trừu tượngPhương thức trừu tượngInterface trong DartInterface ngầm địnhTriển khai và kế thừaNhiều interfaceÔn tập: Máy tính hình10Bộ sưu tập và kiểu tổng quát
Tổng quan về List, Set và MapBộ sưu tập an toàn về kiểuLớp tổng quátPhương thức tổng quátRàng buộc kiểu tổng quátIterable và IteratorÔn tập: Lưu trữ tổng quát2Hàm khởi tạo trong Dart
Hàm khởi tạo mặc địnhHàm khởi tạo có tênDanh sách khởi tạoHàm khởi tạo hằng sốHàm khởi tạo nhà máyHàm khởi tạo chuyển hướngÔn tập: Trình tạo hình dạng5Đóng gói
Thành viên công khai và riêng tưQuy ước tiền tố _Tính riêng tư ở cấp thư việnTìm hiểu sâu về getter và setterChe giấu thông tinÔn tập: hồ sơ học sinh8Mixin
Giới thiệu về MixinTạo MixinSử dụng nhiều MixinTừ khóa on trong MixinMixin và kế thừaMixin và giao diệnÔn tập: hệ thống động vật11Phương thức đặc biệt
Ghi đè toString()Ghi đè hashCode và ==Giao diện ComparablePhương thức call()Ghi đè noSuchMethodÔn tập: bộ sưu tập tùy chỉnh3Thuộc tính của lớp
Thành viên instance và thành viên tĩnhTrường final và constBiến latePhương thức và trường tĩnhGetter và setterÔn tập: trình quản lý tài khoản ngân hàng6Kế thừa
Kế thừa cơ bảnTừ khóa superGhi đè phương thứcChú thích @overrideTừ khóa lớp finalHàm khởi tạo và kế thừaÔn tập: phân cấp nhân viên9Đa hình
Khái niệm cơ bản về đa hìnhĐa hình qua giao diệnKiểm tra kiểu lúc chạyToán tử is và asTừ khóa hiệp biếnÔn tập: Bộ xử lý thanh toánTự luyện tập: Trình biên dịch Dart online