Có thể áp dụng các phương pháp mở rộng cho các giao diện không?


123

Có thể áp dụng một phương pháp mở rộng cho một giao diện không? (Câu hỏi C #)

Đó là ví dụ để đạt được những điều sau:

  1. tạo giao diện ITopology

  2. tạo một phương thức mở rộng cho giao diện này (ví dụ: public static int CountNodes (topologyIf ITopology này))

  3. sau đó khi tạo một lớp (ví dụ MyGraph) triển khai ITopology, thì nó sẽ tự động có phần mở rộng Đếm nút.

Bằng cách này, các lớp triển khai giao diện sẽ không phải có một tên lớp đã đặt để phù hợp với những gì đã được định nghĩa trong phương thức mở rộng.

Câu trả lời:


188

Tất nhiên họ có thể; hầu hết Linq được xây dựng dựa trên các phương pháp mở rộng giao diện.

Các giao diện thực sự là một trong những động lực cho sự phát triển của các phương pháp khuyến nông; vì chúng không thể triển khai bất kỳ chức năng nào của riêng chúng, các phương thức mở rộng là cách dễ nhất để liên kết mã thực với các định nghĩa giao diện.

Xem lớp Enumerable để biết toàn bộ bộ sưu tập các phương thức mở rộng được xây dựng xung quanh IEnumerable<T>. Để triển khai một, nó giống như triển khai một cho một lớp:

public static class TopologyExtensions
{
    public static void CountNodes(this ITopology topology)
    {
        // ...
    }
}

Không có gì đặc biệt khác biệt về các phương thức mở rộng liên quan đến các giao diện; một phương thức mở rộng chỉ là một phương thức tĩnh mà trình biên dịch áp dụng một số cú pháp để làm cho nó trông giống như phương thức là một phần của kiểu đích.


33
Re: "Tất nhiên" - Tôi nghĩ câu hỏi tiết lộ mùi kiến ​​trúc mà bạn ngầm đề cập. Nếu bạn có thể có phần mở rộng trên giao diện, tại sao giao diện không thể chứa các phương thức được triển khai? Có thể hiểu được khi nghĩ rằng một trong hai giao diện phải có các phương thức cụ thể, hoặc, một khi bạn biết chúng không thể, hãy nghĩ rằng không nên cho phép các phương thức mở rộng như một phương thức khả thi. (Nhưng đúng là như vậy. Không phải bàn cãi về câu trả lời xuất sắc của bạn, chỉ là "tất nhiên" và liên kết đến IEnum, không phải LINQ .; ^ D) Có thứ gì đó bốc mùi ở đó!
ruffin

Muốn thêm tin tức vào bình luận @ruffin rằng bây giờ bạn có thể thêm các triển khai mặc định cho các phương thức giao diện C #. Nguồn: devblogs.microsoft.com/dotnet/…
Vinigas

@ruffin Tôi thấy đây là quyết định kiến ​​trúc khó hiểu nhất trong C #. Đôi khi nó kết thúc cấu trúc giao diện nửa lớp nửa lộn xộn xung quanh. Tuy nhiên, tôi tin rằng nó có thể hữu ích khi được tiếp cận từ quan điểm lập trình chức năng và được sử dụng để giới thiệu các tiện ích cho giao diện hơn là triển khai chức năng.
Guney Ozsan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.