web-dev-qa-db-fra.com

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

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

C'est par exemple pour atteindre les objectifs suivants:

  1. créer une interface ITopology

  2. créer une méthode d'extension pour cette interface (par exemple, public static int CountNodes (cette topologie ITopologyIf))

  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 avec ce qui a été défini dans la méthode d'extension.

112
Greg

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

Les interfaces étaient en fait l'un des moteurs du développement de 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 à des définitions d'interface.

Voir la classe Enumerable pour toute une collection de méthodes d'extension construites autour de IEnumerable<T>. Pour en implémenter un, c'est comme 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 n'est qu'une méthode statique à laquelle le compilateur applique du sucre syntaxique pour lui donner l'impression que la méthode fait partie du type cible.

173
Aaronaught