Menu
CoddyTech

Ghi đè ToString()

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

Mọi lớp trong C# đều kế thừa từ object, lớp này cung cấp phương thức ToString(). Theo mặc định, phương thức này trả về tên kiểu đầy đủ, không hữu ích lắm khi bạn muốn xem dữ liệu thực tế của một đối tượng.

Bạn có thể ghi đè ToString() để trả về một chuỗi thể hiện đối tượng của bạn có ý nghĩa hơn:

public class Person
{
    public string Name { get; }
    public int Age { get; }
    
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
    
    public override string ToString()
    {
        return $"{Name} ({Age} years old)";
    }
}

Bây giờ, khi bạn in ra hoặc nối một đối tượng Person, bạn sẽ nhận được kết quả dễ đọc:

Person p = new Person("Alice", 30);
Console.WriteLine(p);  // Alice (30 tuổi)

Nếu không ghi đè, câu lệnh này sẽ in ra nội dung như MyNamespace.Person. Bạn cần dùng từ khóa override vì bạn đang thay thế phương thức được kế thừa từ object. Điều này đặc biệt hữu ích khi gỡ lỗi và ghi nhật ký, vì bạn cần nhanh chóng nắm được trạng thái của một đối tượng.

challenge icon

Thử thách

Dễ

Hãy tạo một lớp Book cung cấp biểu diễn chuỗi có ý nghĩa khi in ra, giúp việc gỡ lỗi và hiển thị thông tin sách trực quan hơn nhiều.

Bạn sẽ tổ chức code trong hai tệp:

  • Book.cs: Tạo một lớp Book trong không gian tên Library để biểu diễn một cuốn sách cùng các thông tin thiết yếu. Lớp sách cần có:
    • Ba thuộc tính chỉ đọc: Title (chuỗi), Author (chuỗi) và Year (số nguyên)
    • Một hàm khởi tạo nhận title, author và year theo đúng thứ tự đó
    • Một phương thức ToString() được ghi đè để trả về chuỗi theo định dạng: "{Title}" by {Author} ({Year})
    Lưu ý: title cần được đặt trong dấu ngoặc kép trong đầu ra!
  • Program.cs: Trong tệp chính, hãy tạo một đối tượng Book bằng các giá trị đầu vào rồi in trực tiếp đối tượng đó. Nhờ ghi đè ToString(), khi truyền đối tượng sách vào Console.WriteLine(), thông tin theo định dạng sẽ tự động hiển thị thay vì tên kiểu dữ liệu.

Bạn sẽ nhận ba giá trị đầu vào:

  • Title của sách (chuỗi)
  • Tên tác giả (chuỗi)
  • Năm xuất bản (số nguyên)

In trực tiếp đối tượng sách bằng Console.WriteLine().

Ví dụ, nếu đầu vào là The Great Gatsby, F. Scott Fitzgerald và 1925, đầu ra sẽ là:

"The Great Gatsby" by F. Scott Fitzgerald (1925)

Điểm thú vị ở đây là bạn không gọi ToString() một cách tường minh. Khi truyền một đối tượng vào Console.WriteLine(), phương thức này sẽ tự động gọi phương thức ToString() của đối tượng. Phần ghi đè giúp đầu ra hữu ích, thay vì chỉ hiển thị Library.Book!

Tự làm thử

using System;
using Library;

class Program
{
    public static void Main(string[] args)
    {
        // Đọc đầu vào
        string title = Console.ReadLine();
        string author = Console.ReadLine();
        int year = Convert.ToInt32(Console.ReadLine());

        // TODO: Tạo đối tượng Book bằng các giá trị đầu vào

        // TODO: In trực tiếp đối tượng Book bằng Console.WriteLine()
    }
}
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 C# online