Looking for c# Keywords? Try Ask4Keywords

C# Language Расширения и интерфейсы вместе позволяют DRY-код и смешанную функциональность


пример

Методы расширения позволяют упростить определения вашего интерфейса, включая только основные необходимые функции в самом интерфейсе и позволяющие определять методы удобства и перегрузки как методы расширения. Интерфейсы с меньшим количеством методов легче реализовать в новых классах. Сохранение перегрузок в виде расширений, а не включение их в интерфейс напрямую избавляет вас от копирования кода шаблона в каждую реализацию, помогая вам сохранить код DRY. На самом деле это похоже на шаблон mixin, который C # не поддерживает.

Расширение System.Linq.Enumerable для IEnumerable<T> - отличный пример этого. IEnumerable<T> требует, чтобы реализующий класс реализовал два метода: общий и не общий GetEnumerator() . Но System.Linq.Enumerable предоставляет множество полезных утилит в качестве расширений, обеспечивающих краткое и четкое потребление IEnumerable<T> .

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

public interface ITimeFormatter
{
   string Format(TimeSpan span);
}

public static class TimeFormatter
{
    // Provide an overload to *all* implementers of ITimeFormatter.
    public static string Format(
        this ITimeFormatter formatter,
        int millisecondsSpan)
        => formatter.Format(TimeSpan.FromMilliseconds(millisecondsSpan));
}

// Implementations only need to provide one method. Very easy to
// write additional implementations.
public class SecondsTimeFormatter : ITimeFormatter
{
   public string Format(TimeSpan span)
   {
       return $"{(int)span.TotalSeconds}s";
   }
}

class Program
{
    static void Main(string[] args)
    {
        var formatter = new SecondsTimeFormatter();
        // Callers get two method overloads!
        Console.WriteLine($"4500ms is rougly {formatter.Format(4500)}");
        var span = TimeSpan.FromSeconds(5);
        Console.WriteLine($"{span} is formatted as {formatter.Format(span)}");
    }
}