Menu
CoddyTech

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();  // 3

Tham 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);  // true

Kỹ 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.

challenge icon

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ên IntExtensions trong namespace Utilities. Lớp này sẽ chứa các phương thức mở rộng cho kiểu int:
    • IsEven(): trả về true nếu số đó là số chẵn, nếu không thì trả về false
    • Square(): trả về tích của số đó với chính nó
    • IsInRange(int min, int max): trả về true nế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
    Hãy nhớ rằng phương thức mở rộng phải là phương thức static trong một lớp static, với tham số đầu tiên dùng từ khóa 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]? True

Hã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}

    }
}
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