Menu
CoddyTech

Lớp cơ sở 'object'

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 23 trên 70.

Trong C#, mọi lớp bạn tạo đều tự động kế thừa từ một lớp đặc biệt có tên là object. Ngay cả khi bạn không chỉ định rõ lớp cơ sở, lớp của bạn vẫn có object làm tổ tiên cao nhất. Điều này có nghĩa là mọi kiểu dữ liệu trong C# đều dùng chung một tập hợp phương thức.

Lớp object cung cấp một số phương thức ảo mà bạn có thể ghi đè trong lớp của mình:

public class Person
{
    public string Name { get; set; }
    
    // Ghi đè phương thức từ object
    public override string ToString()
    {
        return $"Person: {Name}";
    }
    
    public override bool Equals(object obj)
    {
        if (obj is Person other)
            return Name == other.Name;
        return false;
    }
    
    public override int GetHashCode()
    {
        return Name?.GetHashCode() ?? 0;
    }
}

Ba phương thức thường được ghi đè nhất là ToString() để biểu diễn chuỗi, Equals() để so sánh các đối tượng và GetHashCode() cho các tập hợp dựa trên mã băm. Theo mặc định, ToString() trả về tên kiểu dữ liệu, còn Equals() kiểm tra tính bằng nhau của tham chiếu.

Vì mọi thứ đều kế thừa từ object, bạn có thể lưu bất kỳ kiểu nào trong một biến object:

object item1 = new Person { Name = "Alice" };
object item2 = 42;
object item3 = "Hello";

Console.WriteLine(item1.ToString());  // Person: Alice

Lớp cơ sở phổ quát này giúp tạo ra các tính năng như bộ sưu tập có thể chứa nhiều kiểu dữ liệu, đồng thời cho phép mọi đối tượng trong C# truy cập các phương thức (method) như ToString() và GetType().

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống so sánh sách để minh họa cách ghi đè các phương thức (method) từ lớp cơ sở object giúp các kiểu dữ liệu tùy chỉnh có hành vi hữu ích khi biểu diễn dưới dạng chuỗi và kiểm tra tính bằng nhau.

Bạn sẽ tạo hai tệp để sắp xếp code:

  • Book.cs: Định nghĩa lớp Book trong không gian tên Library. Lớp sách của bạn cần có các thuộc tính Title (chuỗi) và Author (chuỗi), cùng với hàm khởi tạo để thiết lập cả hai giá trị. Ghi đè ba phương thức chính được kế thừa từ object:
    • ToString() cần trả về "{Title} by {Author}"
    • Equals(object obj) cần trả về true nếu đối tượng còn lại là một Book có cùng Title và Author
    • GetHashCode() cần kết hợp mã băm của cả hai thuộc tính
  • Program.cs: Trong tệp chính, hãy tạo hai quyển sách bằng các giá trị đầu vào. Hiển thị từng quyển sách bằng ToString(), sau đó kiểm tra xem chúng có bằng nhau không và in kết quả. Cuối cùng, minh họa rằng bạn có thể lưu một Book trong biến object mà vẫn nhận được kết quả có ý nghĩa khi gọi ToString().

Bạn sẽ nhận bốn dữ liệu đầu vào:

  • Tên quyển sách thứ nhất
  • Tác giả quyển sách thứ nhất
  • Tên quyển sách thứ hai
  • Tác giả quyển sách thứ hai

In kết quả theo định dạng sau:

Book 1: {ToString result}
Book 2: {ToString result}
Are they equal? {True/False}
Stored as object: {ToString result of first book stored in object variable}

Ví dụ, nếu dữ liệu đầu vào là 1984, George Orwell, 1984 và George Orwell, kết quả sẽ là:

Book 1: 1984 by George Orwell
Book 2: 1984 by George Orwell
Are they equal? True
Stored as object: 1984 by George Orwell

Nếu dữ liệu đầu vào là 1984, George Orwell, Brave New World và Aldous Huxley, kết quả sẽ là:

Book 1: 1984 by George Orwell
Book 2: Brave New World by Aldous Huxley
Are they equal? False
Stored as object: 1984 by George Orwell

Hãy chú ý cách các phương thức được ghi đè giúp đối tượng Book có hành vi hữu ích: chúng hiển thị đẹp dưới dạng chuỗi và có thể được so sánh dựa trên nội dung thay vì chỉ dựa vào tham chiếu trong bộ nhớ!

Tự làm thử

using System;
using Library;

class Program
{
    public static void Main(string[] args)
    {
        // Đọc dữ liệu đầu vào cho hai cuốn sách
        string title1 = Console.ReadLine();
        string author1 = Console.ReadLine();
        string title2 = Console.ReadLine();
        string author2 = Console.ReadLine();

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

        // TODO: In Book 1 bằng ToString()
        // Định dạng: "Book 1: {ToString result}"

        // TODO: In Book 2 bằng ToString()
        // Định dạng: "Book 2: {ToString result}"

        // TODO: Kiểm tra hai cuốn sách có bằng nhau không và in kết quả
        // Định dạng: "Are they equal? {True/False}"

        // TODO: Lưu cuốn sách đầu tiên vào một biến kiểu object rồi in ra
        // Định dạng: "Stored as object: {ToString result}"
    }
}
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