Dapatkah metode ekstensi diterapkan ke antarmuka?

123

Apakah mungkin menerapkan metode ekstensi ke antarmuka? (C # pertanyaan)

Itu misalnya untuk mencapai yang berikut:

  1. membuat antarmuka ITopologi

  2. buat metode ekstensi untuk antarmuka ini (misalnya CountNodes int statis publik (topologyIf ITopology ini))

  3. kemudian saat membuat kelas (misalnya MyGraph) yang mengimplementasikan ITopology, maka secara otomatis akan memiliki ekstensi Count Nodes.

Dengan cara ini kelas yang mengimplementasikan antarmuka tidak harus memiliki nama kelas yang ditetapkan agar selaras dengan apa yang didefinisikan dalam metode ekstensi.

Greg
sumber

Jawaban:

188

Tentu saja bisa; sebagian besar Linq dibangun di sekitar metode ekstensi antarmuka.

Antarmuka sebenarnya adalah salah satu kekuatan pendorong untuk pengembangan metode penyuluhan; karena mereka tidak dapat mengimplementasikan fungsinya sendiri, metode ekstensi adalah cara termudah untuk mengaitkan kode aktual dengan definisi antarmuka.

Lihat kelas Enumerable untuk seluruh kumpulan metode ekstensi yang dibangun di sekitar IEnumerable<T>. Untuk mengimplementasikannya, itu sama dengan mengimplementasikan satu untuk sebuah kelas:

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

Tidak ada yang sangat berbeda tentang metode ekstensi sejauh menyangkut antarmuka; metode ekstensi hanyalah metode statis yang kompilator menerapkan beberapa gula sintaksis agar terlihat seperti metode tersebut adalah bagian dari tipe target.

Aaronaught
sumber
33
Re: "Tentu saja" - Saya pikir pertanyaan itu mengungkapkan bau arsitektur yang Anda sebutkan secara implisit. Jika Anda dapat memiliki ekstensi pada antarmuka, mengapa antarmuka tidak dapat berisi metode yang diterapkan? Dapat dimengerti untuk berpikir bahwa antarmuka mana pun harus dapat memiliki metode konkret, atau, begitu Anda tahu mereka tidak bisa, berpikir bahwa metode ekstensi tidak boleh diizinkan sebagai kludge yang layak. (Tapi mereka. Tidak memperdebatkan jawaban Anda yang luar biasa, hanya "tentu saja" dan tautan ke IEnum, bukan LINQ .; ^ D) Ada yang bau di sana!
ruffin
Ingin menambahkan berita ke komentar @ruffin bahwa sekarang Anda dapat menambahkan implementasi default ke metode antarmuka C #. Sumber: devblogs.microsoft.com/dotnet/…
Vinigas
@ruffin Saya menemukan ini keputusan arsitektur yang paling membingungkan di C #. Kadang-kadang itu berakhir dengan struktur setengah-antarmuka kelas setengah main-main. Namun, saya yakin ini dapat berguna ketika didekati dari sudut pandang pemrograman fungsional, dan digunakan untuk memperkenalkan utilitas ke antarmuka daripada mengimplementasikan fungsionalitas.
Guney Ozsan