¿Se pueden aplicar los métodos de extensión a las interfaces?

123

¿Es posible aplicar un método de extensión a una interfaz? (C # pregunta)

Eso es, por ejemplo, lograr lo siguiente:

  1. crear una interfaz de ITopology

  2. cree un método de extensión para esta interfaz (por ejemplo, public static int CountNodes (esta topología de ITopologyIf))

  3. luego, al crear una clase (por ejemplo, MyGraph) que implementa ITopology, automáticamente tendría la extensión Count Nodes.

De esta manera, las clases que implementan la interfaz no tendrían que tener un nombre de clase establecido para alinearse con lo que se definió en el método de extensión.

Greg
fuente

Respuestas:

188

Por supuesto que pueden; La mayor parte de Linq se basa en métodos de extensión de interfaz.

Las interfaces fueron en realidad una de las fuerzas impulsoras para el desarrollo de métodos de extensión; Como no pueden implementar ninguna de sus propias funciones, los métodos de extensión son la forma más fácil de asociar el código real con las definiciones de interfaz.

Consulte la clase Enumerable para ver una colección completa de métodos de extensión creados alrededor IEnumerable<T>. Para implementar uno, es lo mismo que implementar uno para una clase:

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

No hay nada particularmente diferente sobre los métodos de extensión en lo que respecta a las interfaces; un método de extensión es solo un método estático al que el compilador aplica algo de azúcar sintáctico para que parezca que el método es parte del tipo de destino.

Aaronaught
fuente
33
Re: "Por supuesto" - Creo que la pregunta revela el olor de la arquitectura que mencionas implícitamente. Si puede tener extensiones en las interfaces, ¿por qué las interfaces no pueden contener métodos implementados? Es comprensible pensar que cualquiera de las interfaces debería poder tener métodos concretos o, una vez que sepa que no pueden, pensar que los métodos de extensión no deberían permitirse como un error viable. (Pero lo están. Sin discutir su excelente respuesta, solo el "por supuesto" y el enlace a IEnum, no LINQ .; ^ D) ¡Algo huele mal allí!
ruffin
Me gustaría agregar noticias al comentario de @ruffin de que ahora puede agregar implementaciones predeterminadas a los métodos de interfaz C #. Fuente: devblogs.microsoft.com/dotnet/…
Vinigas
@ruffin Encontré esta la decisión arquitectónica más confusa en C #. A veces termina con una estructura de media interfaz de clase media que se mete por todos lados. Aún así, creo que puede ser útil cuando se aborda desde el punto de vista de la programación funcional, y se utiliza para introducir utilidades a las interfaces en lugar de implementar la funcionalidad.
Guney Ozsan