Phương thức mở rộng
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 39 trên 70.
Phương thức mở rộng giúp bạn thêm phương thức mới vào các kiểu dữ liệu hiện có mà không cần sửa mã nguồn hoặc tạo lớp dẫn xuất. Chúng trông như phương thức có sẵn của kiểu dữ liệu, giúp code của bạn dễ đọc và dễ hiểu hơn.
Để tạo một phương thức mở rộng, hãy định nghĩa một phương thức static trong một lớp static, với tham số đầu tiên đứng sau từ khóa this:
public static class StringExtensions
{
public static int WordCount(this string str)
{
return str.Split(' ').Length;
}
}Giờ bạn có thể gọi phương thức này trực tiếp trên bất kỳ chuỗi nào:
string sentence = "Hello World Today";
int count = sentence.WordCount(); // 3Tham số this string str cho trình biên dịch biết phương thức này mở rộng kiểu string. Khi bạn gọi sentence.WordCount(), phía sau, trình biên dịch chuyển lời gọi đó thành StringExtensions.WordCount(sentence).
Phương thức mở rộng cũng có thể nhận thêm tham số:
public static bool IsLongerThan(this string str, int length)
{
return str.Length > length;
}
// Cách dùng
bool result = "Hello".IsLongerThan(3); // trueKỹ thuật này được dùng rộng rãi trong LINQ, nơi các phương thức như Where() và Select() là phương thức mở rộng trên IEnumerable. Phương thức mở rộng rất hữu ích khi thêm các hàm tiện ích vào những kiểu dữ liệu mà bạn không kiểm soát, giúp code gọn gàng và dễ hiểu.
Thử thách
DễHãy tạo một tập hợp các phương thức mở rộng (extension method) hữu ích cho số nguyên, bổ sung những tiện ích mà bạn mong đợi sẽ có sẵn. Bạn sẽ tạo một lớp static chứa các phương thức mở rộng có thể gọi trực tiếp trên bất kỳ số nguyên nào, giúp code rõ nghĩa và dễ đọc hơn.
Bạn sẽ sắp xếp code trong hai tệp:
IntExtensions.cs: Tạo một lớp static có tênIntExtensionstrong namespaceUtilities. Lớp này sẽ chứa các phương thức mở rộng cho kiểuint:IsEven(): trả vềtruenếu số đó là số chẵn, nếu không thì trả vềfalseSquare(): trả về tích của số đó với chính nóIsInRange(int min, int max): trả vềtruenếu số đó nằm trong khoảng từ min đến max (bao gồm cả hai đầu), nếu không thì trả vềfalse
thisđể chỉ định kiểu mà bạn đang mở rộng.Program.cs: Trong tệp chính, hãy đọc một số nguyên từ đầu vào và minh họa cả ba phương thức mở rộng. Gọi trực tiếp từng phương thức trên số nguyên như thể đó là một phương thức có sẵn, sau đó in ra kết quả.
Bạn sẽ nhận được ba đầu vào:
- Một số cần kiểm tra (số nguyên)
- Giá trị nhỏ nhất để kiểm tra phạm vi (số nguyên)
- Giá trị lớn nhất để kiểm tra phạm vi (số nguyên)
In ra đầu ra theo định dạng sau:
Is {number} even? {True/False}
Square of {number}: {result}
Is {number} in range [{min}-{max}]? {True/False}Ví dụ, nếu đầu vào là 7, 5 và 10, đầu ra sẽ là:
Is 7 even? False
Square of 7: 49
Is 7 in range [5-10]? TrueHãy để ý bạn có thể viết number.IsEven() và number.Square() tự nhiên đến mức nào. Các phương thức mở rộng tạo cảm giác như chúng vốn luôn là một phần của kiểu số nguyên!
Tự làm thử
using System;
using Utilities;
class Program
{
public static void Main(string[] args)
{
// Đọc các giá trị đầu vào
int number = Convert.ToInt32(Console.ReadLine());
int min = Convert.ToInt32(Console.ReadLine());
int max = Convert.ToInt32(Console.ReadLine());
// TODO: Dùng các phương thức mở rộng của 'number' và in kết quả
// Gọi number.IsEven(), number.Square() và number.IsInRange(min, max)
// In theo định dạng:
// {number} có phải là số chẵn không? {True/False}
// Bình phương của {number}: {result}
// {number} có nằm trong khoảng [{min}-{max}] không? {True/False}
}
}
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