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


123

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

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

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

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

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

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

Ответы:


189

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

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

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

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

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


33
Касательно: «Конечно» - я думаю, что вопрос раскрывает запах архитектуры, который вы неявно упоминаете. Если у вас могут быть расширения на интерфейсах, почему интерфейсы не могут содержать реализованные методы? Понятно думать, что либо интерфейсы должны иметь конкретные методы, либо, если вы знаете, что они не могут, думать, что методы расширения не должны допускаться как жизнеспособный кладж. (Но они есть. Не спорю с вашим отличным ответом, просто «конечно» и ссылка на IEnum, а не на LINQ .; ^ D) Здесь что-то воняет!
ruffin

Хотел бы добавить новость в комментарий @ruffin, что теперь вы можете добавлять реализации по умолчанию в методы интерфейса C #. Источник: devblogs.microsoft.com/dotnet/…
Винигас

@ruffin Мне показалось, что это самое запутанное архитектурное решение в C #. Иногда это заканчивается беспорядком в структуре полуинтерфейса половинного класса. Тем не менее, я считаю, что он может быть полезен с точки зрения функционального программирования и использоваться для введения утилит в интерфейсы, а не для реализации функциональности.
Гуней Озсан,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.