Могут ли методы расширения применяться к интерфейсам?

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

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

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

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

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

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

Ответ 1

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

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

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

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

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