È possibile applicare metodi di estensione alle interfacce?


123

È possibile applicare un metodo di estensione a un'interfaccia? (Domanda C #)

Ad esempio per ottenere quanto segue:

  1. creare un'interfaccia ITopology

  2. creare un metodo di estensione per questa interfaccia (ad esempio public static int CountNodes (this ITopology topologyIf))

  3. quindi quando si crea una classe (es. MyGraph) che implementa ITopology, allora avrà automaticamente l'estensione Count Nodes.

In questo modo le classi che implementano l'interfaccia non dovrebbero avere un nome di classe impostato per allinearsi a quanto definito nel metodo di estensione.

Risposte:


188

Certo che possono; la maggior parte di Linq è costruita attorno a metodi di estensione dell'interfaccia.

Le interfacce erano in realtà una delle forze trainanti per lo sviluppo di metodi di estensione; poiché non possono implementare nessuna delle proprie funzionalità, i metodi di estensione sono il modo più semplice per associare il codice effettivo alle definizioni dell'interfaccia.

Vedere la classe Enumerable per un'intera raccolta di metodi di estensione costruiti intorno IEnumerable<T>. Per implementarne uno, è come implementarne uno per una classe:

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

Non c'è niente di particolarmente diverso nei metodi di estensione per quanto riguarda le interfacce; un metodo di estensione è solo un metodo statico a cui il compilatore applica un po 'di zucchero sintattico per far sembrare che il metodo faccia parte del tipo di destinazione.


33
Ri: "Certamente" - Penso che la domanda riveli l'odore dell'architettura che dici implicitamente. Se puoi avere estensioni sulle interfacce, perché le interfacce non possono contenere metodi implementati? È comprensibile pensare che entrambe le interfacce dovrebbero essere in grado di avere metodi concreti o, una volta che sai che non possono, pensare che i metodi di estensione non dovrebbero essere consentiti come un kludge praticabile. (Ma lo sono. Non discutendo la tua eccellente risposta, solo il "ovviamente" e il collegamento a IEnum, non LINQ .; ^ D) C'è qualcosa di puzzolente!
ruffin

Vorrei aggiungere notizie al commento @ruffin che ora puoi aggiungere implementazioni predefinite ai metodi dell'interfaccia C #. Fonte: devblogs.microsoft.com/dotnet/…
Vinigas

@ruffin Ho trovato questa la decisione architettonica più confusa in C #. A volte finisce con la struttura a mezza interfaccia di mezza classe che fa casino. Tuttavia, credo che possa essere utile se affrontato dal punto di vista della programmazione funzionale e utilizzato per introdurre utilità nelle interfacce piuttosto che implementare funzionalità.
Guney Ozsan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.