Os métodos de extensão podem ser aplicados às interfaces?

123

É possível aplicar um método de extensão a uma interface? (Pergunta em C #)

Por exemplo, para obter o seguinte:

  1. criar uma interface ITopology

  2. crie um método de extensão para essa interface (por exemplo, public static int CountNodes (este ITopology topologyIf))

  3. depois, ao criar uma classe (por exemplo, MyGraph) que implementa o ITopology, ela terá automaticamente a extensão Count Nodes.

Dessa forma, as classes que implementam a interface não precisariam ter um nome de classe definido para se alinhar ao que foi definido no método de extensão.

Greg
fonte

Respostas:

188

Claro que eles podem; a maior parte do Linq é construída com base nos métodos de extensão de interface.

As interfaces eram na verdade uma das forças motrizes para o desenvolvimento de métodos de extensão; como eles não podem implementar nenhuma funcionalidade própria, os métodos de extensão são a maneira mais fácil de associar o código real às definições de interface.

Veja a classe Enumerable para uma coleção inteira de métodos de extensão criados IEnumerable<T>. Para implementar um, é o mesmo que implementar um para uma classe:

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

Não há nada particularmente diferente nos métodos de extensão no que diz respeito às interfaces; um método de extensão é apenas um método estático ao qual o compilador aplica algum açúcar sintático para fazer com que pareça que o método faz parte do tipo de destino.

Aaronaught
fonte
33
Re: "Claro" - acho que a pergunta revela o cheiro da arquitetura que você menciona implicitamente. Se você pode ter extensões nas interfaces, por que as interfaces não podem conter métodos implementados? É compreensível pensar que as interfaces devem poder ter métodos concretos ou, uma vez que você sabe que não podem, pensar que os métodos de extensão não devem ser permitidos como um argumento viável. (Mas eles estão. Sem discutir sua excelente resposta, apenas o "claro" e o link para o IEnum, não o LINQ .; ^ D) Algo está fedorento!
Ruffin 23/05
Gostaria de adicionar notícias ao comentário do @ruffin que agora você pode adicionar implementações padrão aos métodos de interface do C #. Fonte: devblogs.microsoft.com/dotnet/…
Vinigas
@ ruffin Achei essa a decisão arquitetônica mais confusa em c #. Às vezes, acaba a estrutura de meia interface de meia classe mexendo por toda parte. Ainda assim, acredito que pode ser útil quando abordado do ponto de vista da programação funcional e usado para introduzir utilitários nas interfaces, em vez de implementar a funcionalidade.
Guney Ozsan 28/01