Cú pháp kế thừa cơ bản (:)
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 19 trên 70.
Kế thừa cho phép một lớp nhận các thuộc tính và phương thức của lớp khác. Thay vì viết lại cùng một đoạn code, bạn tạo một lớp cơ sở (lớp cha) có chức năng dùng chung, sau đó tạo các lớp dẫn xuất (lớp con) kế thừa từ lớp đó.
Trong C#, bạn dùng ký hiệu dấu hai chấm : để biểu thị tính kế thừa:
public class Animal
{
public string Name { get; set; }
public void Eat()
{
Console.WriteLine($"{Name} is eating.");
}
}
public class Dog : Animal
{
public void Bark()
{
Console.WriteLine($"{Name} says Woof!");
}
}Lớp Dog kế thừa mọi thứ từ Animal. Lớp này có thể truy cập thuộc tính Name và phương thức Eat() mà không cần khai báo lại, đồng thời bổ sung phương thức Bark() của riêng mình:
Dog myDog = new Dog();
myDog.Name = "Buddy";
myDog.Eat(); // Đầu ra: Buddy is eating.
myDog.Bark(); // Đầu ra: Buddy says Woof!C# chỉ hỗ trợ kế thừa đơn, nghĩa là một lớp chỉ có thể kế thừa từ một lớp cơ sở. Tuy nhiên, bạn có thể tạo chuỗi kế thừa, trong đó một lớp dẫn xuất trở thành lớp cơ sở cho lớp khác. Cách này tạo ra một hệ thống phân cấp mô phỏng các mối quan hệ trong thế giới thực, đồng thời giúp code của bạn có tổ chức và dễ tái sử dụng.
Thử thách
DễHãy xây dựng một hệ thống phân cấp phương tiện để minh họa cách tính kế thừa cho phép các lớp dẫn xuất dùng chung chức năng từ lớp cơ sở, đồng thời bổ sung các hành vi riêng.
Bạn sẽ tạo ba tệp để sắp xếp code:
Vehicle.cs: Định nghĩa lớpVehicletrong không gian tênTransport. Đây sẽ là lớp cơ sở dùng chung cho tất cả phương tiện. Lớp này cần có thuộc tínhBrand(chuỗi) và thuộc tínhYear(số nguyên), cùng với phương thứcStartEngine()để in ra"{Brand} engine started."Car.cs: Định nghĩa lớpCartrong không gian tênTransport, kế thừa từVehicle. Lớp xe này bổ sung thuộc tính riêngNumberOfDoors(số nguyên) và phương thứcHonk()để in ra"{Brand} goes Beep Beep!"Program.cs: Trong tệp chính, tạo một instanceCarbằng các giá trị đầu vào. Thiết lập các thuộc tính của xe, bao gồm cả những thuộc tính được kế thừa, rồi minh họa rằng xe có thể dùng cả phương thức riêng lẫn phương thức kế thừa từVehicle.
Bạn sẽ nhận ba giá trị đầu vào:
- Tên thương hiệu
- Năm
- Số cửa
In thông tin của xe và minh họa các chức năng của xe theo định dạng sau:
Car: {Brand} ({Year})
Doors: {NumberOfDoors}
{StartEngine output}
{Honk output}Ví dụ, nếu các giá trị đầu vào là Toyota, 2022 và 4, đầu ra sẽ là:
Car: Toyota (2022)
Doors: 4
Toyota engine started.
Toyota goes Beep Beep!Hãy chú ý rằng Car có thể truy cập thuộc tính Brand và phương thức StartEngine(), dù chúng được định nghĩa trong Vehicle. Đó là sức mạnh của tính kế thừa: lớp dẫn xuất tự động nhận mọi thứ từ lớp cơ sở!
Tự làm thử
using System;
using Transport;
class Program
{
public static void Main(string[] args)
{
// Đọc đầu vào
string brand = Console.ReadLine();
int year = Convert.ToInt32(Console.ReadLine());
int doors = Convert.ToInt32(Console.ReadLine());
// TODO: Tạo một instance của Car
// TODO: Gán các thuộc tính của xe (Brand, Year, NumberOfDoors)
// TODO: In thông tin của xe theo đúng định dạng sau:
// Car: {Brand} ({Year})
// Doors: {NumberOfDoors}
// Sau đó gọi StartEngine() và Honk()
}
}
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