Можно ли применять методы расширения к интерфейсам? - PullRequest
108 голосов
/ 05 мая 2010

Можно ли применить метод расширения к интерфейсу?(Вопрос C #)

Это, например, для достижения следующего:

  1. создать интерфейс ITopology

  2. создать расширениеметод для этого интерфейса (например, public static int CountNodes (это ITopology topologyIf))

  3. затем при создании класса (например, MyGraph), который реализует ITopology, тогда он будет автоматически иметь расширение Count Nodes.

Таким образом у классов, реализующих интерфейс, не должно быть заданного имени класса, чтобы соответствовать тому, что было определено в методе расширения.

1 Ответ

169 голосов
/ 05 мая 2010

Конечно, они могут; большая часть Linq построена на методах расширения интерфейса.

Интерфейсы были фактически одной из движущих сил для развития методов расширения; Так как они не могут реализовать какую-либо собственную функциональность, методы расширения являются самым простым способом связать реальный код с определениями интерфейса.

См. Класс Enumerable для всей коллекции методов расширения, построенных вокруг IEnumerable<T>. Чтобы реализовать один, это то же самое, что реализовать один для класса:

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

Нет ничего особенного в методах расширения с точки зрения интерфейсов; метод расширения - это просто статический метод, к которому компилятор применяет некоторый синтаксический сахар, чтобы он выглядел так, как будто метод является частью целевого типа.

...