2010-05-05 25 views
78

È possibile applicare un metodo di estensione a un'interfaccia? (C# questione)I metodi di estensione possono essere applicati alle interfacce?

Questo è per esempio per raggiungere il seguente:

  1. creare un'interfaccia ITopology

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

  3. quindi, durante la creazione di una classe (ad es. MyGraph) che implementa ITopology, avrà automaticamente l'estensione Count Nodes.

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

risposta

136

Naturalmente possono; la maggior parte di Linq è basata su 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 alcuna delle loro funzionalità, i metodi di estensione sono il modo più semplice di associare il codice effettivo alle definizioni dell'interfaccia.

Vedere la classe Enumerable per un'intera raccolta di metodi di estensione costruiti attorno a IEnumerable<T>. Per implementare uno, è la stessa di esecuzione uno per una classe:

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

, non particolarmente diverso metodi di estensione, per quanto concerne le interfacce; un metodo di estensione è solo un metodo statico che il compilatore applica allo zucchero sintattico per far sembrare che il metodo sia parte del tipo di destinazione.

+9

Ri: "Naturalmente" - Penso che la domanda sveli l'odore dell'architettura che menzionate implicitamente. Se è possibile avere estensioni sulle interfacce, perché le interfacce non possono contenere metodi implementati? È comprensibile pensare che entrambe le interfacce debbano essere in grado di avere metodi concreti, o, una volta che si è sicuri che non possono, pensare che i metodi di estensione non dovrebbero essere ammessi come kludge fattibile. (Ma lo sono. Non discutendo la tua eccellente risposta, solo il "naturalmente" e il link a IEnum, non [LINQ] (https://github.com/dotnet/corefx/blob/master/src/System.Linq/ src/System/Linq/Contains.cs) .;^D) C'è qualcosa di puzzolente lì! – ruffin

Problemi correlati