Từ khóa 'base'
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 20 trên 70.
Khi một lớp dẫn xuất kế thừa từ lớp cơ sở, bạn thường cần truy cập trực tiếp vào các thành viên của lớp cha. Từ khóa base tạo kết nối này, cho phép bạn gọi hàm khởi tạo của lớp cơ sở hoặc truy cập các phương thức và thuộc tính của lớp đó.
Cách dùng phổ biến nhất của base là gọi hàm khởi tạo của lớp cha. Khi tạo một đối tượng dẫn xuất, bạn có thể truyền giá trị lên lớp cơ sở:
public class Animal
{
public string Name { get; set; }
public Animal(string name)
{
Name = name;
}
}
public class Dog : Animal
{
public string Breed { get; set; }
public Dog(string name, string breed) : base(name)
{
Breed = breed;
}
}Cú pháp : base(name) gọi hàm khởi tạo của Animal trước khi phần thân hàm khởi tạo của Dog chạy. Nhờ vậy, lớp cơ sở được khởi tạo đúng cách trước tiên.
Bạn cũng có thể dùng base để gọi các phương thức của lớp cha bên trong lớp dẫn xuất:
public class Animal
{
public void Speak()
{
Console.WriteLine("Animal sound");
}
}
public class Dog : Animal
{
public void Speak()
{
base.Speak(); // Gọi phương thức Speak của Animal
Console.WriteLine("Woof!");
}
}Ở đây, base.Speak() gọi rõ ràng phiên bản phương thức của lớp cha. Cách này hữu ích khi bạn muốn mở rộng hành vi của lớp cha thay vì thay thế hoàn toàn hành vi đó.
Thử thách
DễHãy xây dựng một hệ thống quản lý kho sản phẩm để minh họa cách các lớp dẫn xuất dùng từ khóa base để khởi tạo đúng lớp cha và mở rộng hành vi được kế thừa.
Bạn sẽ tạo ba tệp để sắp xếp code:
Product.cs: Định nghĩa lớpProducttrong không gian tênInventory. Lớp cơ sở này đại diện cho mọi sản phẩm, với thuộc tínhName(chuỗi) và thuộc tínhPrice(số thập phân). Thêm hàm khởi tạo nhận cả hai giá trị và phương thứcGetInfo()trả về"{Name}: ${Price}".ElectronicProduct.cs: Định nghĩa lớpElectronicProducttrong không gian tênInventory, kế thừa từProduct. Lớp này bổ sung thuộc tínhWarrantyMonths(số nguyên). Hàm khởi tạo cần nhận tên, giá và số tháng bảo hành, dùngbaseđể truyền tên và giá cho hàm khởi tạo của lớp cha. Tạo phương thứcGetInfo()trước tiên gọi phương thứcGetInfo()của lớp cha bằngbase, sau đó thêm" (Warranty: {WarrantyMonths} months)"để mở rộng đầu ra.Program.cs: Trong tệp chính, tạo mộtElectronicProductbằng các giá trị đầu vào và hiển thị đầy đủ thông tin bằng cách gọiGetInfo().
Bạn sẽ nhận ba giá trị đầu vào:
- Tên sản phẩm
- Giá
- Số tháng bảo hành
In ra kết quả gọi GetInfo() trên sản phẩm điện tử của bạn.
Ví dụ: nếu các giá trị đầu vào là Laptop, 999.99 và 24, đầu ra sẽ là:
Laptop: $999.99 (Warranty: 24 months)Hãy chú ý cách lớp dẫn xuất dựa trên đầu ra của lớp cơ sở thay vì lặp lại logic. Từ khóa base giúp bạn tái sử dụng và mở rộng hành vi của lớp cha một cách liền mạch!
Tự làm thử
using System;
using Inventory;
class Program
{
public static void Main(string[] args)
{
// Đọc dữ liệu đầu vào
string name = Console.ReadLine();
decimal price = Convert.ToDecimal(Console.ReadLine());
int warrantyMonths = Convert.ToInt32(Console.ReadLine());
// TODO: Tạo một ElectronicProduct bằng các giá trị đầu vào
// TODO: In ra kết quả khi gọi GetInfo() trên ElectronicProduct bạn vừa tạo
}
}
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