Arayüzlere genişletme yöntemleri uygulanabilir mi?


123

Bir arayüze bir genişletme yöntemi uygulamak mümkün müdür? (C # sorusu)

Örneğin, aşağıdakileri başarmak için:

  1. bir ITopology arayüzü oluşturun

  2. bu arayüz için bir uzantı yöntemi oluşturun (ör. public static int CountNodes (bu ITopology topologyIf))

  3. daha sonra ITopology'yi uygulayan bir sınıf (örn. MyGraph) oluştururken, otomatik olarak Düğümleri Say uzantısına sahip olur.

Bu şekilde, arayüzü uygulayan sınıfların, uzantı yönteminde tanımlananla hizalamak için bir set sınıf adına sahip olması gerekmez.

Yanıtlar:


189

Tabii ki yapabilirler; Linq'in çoğu arayüz genişletme yöntemleri etrafında oluşturulmuştur.

Arayüzler aslında genişletme yöntemlerinin geliştirilmesinde itici güçlerden biriydi; kendi işlevlerinden herhangi birini uygulayamadıklarından, uzantı yöntemleri, gerçek kodu arabirim tanımlarıyla ilişkilendirmenin en kolay yoludur.

Çevresinde oluşturulmuş tüm uzantı yöntemleri koleksiyonu için Enumerable sınıfına bakın IEnumerable<T>. Birini uygulamak, bir sınıf için uygulamakla aynıdır:

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

Arabirimler söz konusu olduğunda, uzantı yöntemlerinde özellikle farklı bir şey yoktur; bir uzatma yöntemi, derleyicinin, yöntemin hedef türün bir parçasıymış gibi görünmesini sağlamak için biraz sözdizimsel şeker uyguladığı statik bir yöntemdir.


33
Re: "Elbette" - Sanırım soru, üstü kapalı olarak bahsettiğiniz mimari kokuyu ortaya çıkarıyor. Arayüzlerde uzantılarınız varsa, neden arayüzler uygulanan yöntemler içeremez? Her iki arayüzün de somut yöntemlere sahip olması gerektiğini düşünmek ya da yapamayacaklarını bildiğinizde, uzatma yöntemlerinin uygulanabilir bir kludge olarak kullanılmasına izin verilmemesi gerektiğini düşünmek anlaşılabilir. (Ama onlar. Mükemmel cevabınızı tartışmıyorlar, sadece "elbette" ve IEnum bağlantısı, LINQ değil . ^ D) Orada bir şey kokuyor !
2016

@Ruffin yorumuna artık C # arayüz yöntemlerine varsayılan uygulamaları ekleyebileceğiniz haberleri eklemek ister misiniz? Kaynak: devblogs.microsoft.com/dotnet/…
Vinigas

@ruffin Bunu C # 'ta en kafa karıştırıcı mimari karar olarak buldum. Bazen yarım sınıf yarı arayüz yapısının etrafını karıştırmasıyla sonuçlanır. Yine de, işlevsel programlama bakış açısından yaklaşıldığında ve işlevsellik uygulamaktan ziyade arayüzlere yardımcı programları tanıtmak için kullanıldığında yararlı olabileceğine inanıyorum.
Güney Özsan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.