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: AliceLớ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().
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ớpBooktrong không gian tênLibrary. Lớp sách của bạn cần có các thuộc tínhTitle(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ềtruenếu đối tượng còn lại là mộtBookcó cùngTitlevàAuthorGetHashCode()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ằngToString(), 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ộtBooktrong biếnobjectmà vẫn nhận được kết quả có ý nghĩa khi gọiToString().
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 OrwellNế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 OrwellHã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}"
}
}
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
1Các khái niệm cơ bản về lập trình hướng đối tượng
Tệp bên ngoàiKhông gian tên và chỉ thịGiới thiệu về lớp và đối tượngTừ khóa thisPhương thức và tham sốTrường và thuộc tínhHàm khởi tạoKhởi tạo đối tượngÔn tập: Máy tính đơn giản4Kế thừa
Cú pháp kế thừa cơ bản (:)Từ khóa 'base'Từ khóa virtual và overrideLớp sealedLớp cơ sở 'object'Ôn tập: hệ phân cấp nhân viên7Tính năng nâng cao
Nạp chồng toán tửBộ lập chỉ mục (this[])Ghi đè ToString()Phương thức mở rộngÔn tập: Danh sách tùy chỉnh10Các mẫu thiết kế phần 1
Giới thiệu về mẫu thiết kếSingleton an toàn với luồngMẫu FactoryMẫu Observer (sự kiện)Mẫu Strategy2Thuộc tính và thành viên tĩnh
Thuộc tính tự độngThuộc tính chỉ đọc hoặc chỉ ghiTrường và phương thức tĩnhLớp tĩnhThành viên có thân biểu thức5Đa hình và interface
Đa hình lúc biên dịch và lúc chạyInterface và lớp trừu tượngNhiều interfaceInterface tường minhUpcasting và downcastingÔn tập: bộ tính toán hình học8Các khái niệm OOP nâng cao
Ưu tiên composition hơn kế thừaGenerics (lớp và phương thức)Delegate và sự kiệnAttribute và reflectionGiao diện IDisposable và câu lệnh usingKiến thức cơ bản về dependency injection11Các mẫu thiết kế phần 2
Mẫu lệnhMẫu bộ chuyển đổiMẫu trang tríMẫu phương thức khuôn mẫuMẫu trạng tháiMẫu tổ hợpTự luyện tập: Trình biên dịch C# online