Les méthodes d'extension peuvent-elles être appliquées aux interfaces?

123

Est-il possible d'appliquer une méthode d'extension à une interface? (Question C #)

C'est par exemple pour réaliser ce qui suit:

  1. créer une interface ITopology

  2. créer une méthode d'extension pour cette interface (par exemple public static int CountNodes (this ITopology topologyIf))

  3. puis lors de la création d'une classe (par exemple MyGraph) qui implémente ITopology, alors elle aurait automatiquement l'extension Count Nodes.

De cette façon, les classes implémentant l'interface n'auraient pas besoin d'avoir un nom de classe défini pour s'aligner sur ce qui a été défini dans la méthode d'extension.

Greg
la source

Réponses:

188

Bien sûr, ils peuvent; la plupart de Linq est construit autour de méthodes d'extension d'interface.

Les interfaces ont été en fait l'une des forces motrices du développement des méthodes d'extension; puisqu'elles ne peuvent implémenter aucune de leurs propres fonctionnalités, les méthodes d'extension sont le moyen le plus simple d'associer du code réel aux définitions d'interface.

Voir la classe Enumerable pour toute une collection de méthodes d'extension construites autour IEnumerable<T>. Pour en implémenter un, c'est la même chose que d'en implémenter un pour une classe:

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

Il n'y a rien de particulièrement différent dans les méthodes d'extension en ce qui concerne les interfaces; une méthode d'extension est juste une méthode statique à laquelle le compilateur applique du sucre syntaxique pour donner l'impression que la méthode fait partie du type cible.

Aaronaught
la source
33
Re: "Bien sûr" - Je pense que la question révèle l'odeur d'architecture que vous mentionnez implicitement. Si vous pouvez avoir des extensions sur les interfaces, pourquoi les interfaces ne peuvent-elles pas contenir des méthodes implémentées? Il est compréhensible de penser que les interfaces devraient pouvoir avoir des méthodes concrètes, ou, une fois que vous savez qu'elles ne le peuvent pas, penser que les méthodes d'extension ne devraient pas être autorisées en tant que kludge viable. (Mais ils le sont. Sans discuter de votre excellente réponse, juste le "bien sûr" et le lien vers IEnum, pas LINQ .; ^ D) Il y a une odeur là-bas!
ruffin
Je voudrais ajouter des nouvelles au commentaire @ruffin que vous pouvez maintenant ajouter des implémentations par défaut aux méthodes d'interface C #. Source: devblogs.microsoft.com/dotnet/…
Vinigas
@ruffin J'ai trouvé que c'était la décision architecturale la plus déroutante en C #. Parfois, cela finit par une structure demi-classe demi-interface qui dérange tout autour. Pourtant, je pense qu'il peut être utile lorsqu'il est abordé du point de vue de la programmation fonctionnelle et utilisé pour introduire des utilitaires dans des interfaces plutôt que pour implémenter des fonctionnalités.
Guney Ozsan le