Использование делегатов вместо интерфейсов (Руководство по программированию в C#)

И делегаты, и интерфейсы позволяют конструктору классов отделять объявление типов от реализации. Определенный интерфейс может быть унаследован и реализован любым классом или структурой. Делегат может быть создан для метода в любом классе, если метод соответствует сигнатуре метода для делегата. Ссылка на интерфейс или делегат могут быть использованы объектом, не имеющим данных о классе, реализующем интерфейс или метод делегата. Учитывая эти сходные признаки, когда в конструкторе классов следует использовать делегат, а когда следует использовать интерфейс?

Делегат следует использовать в следующих ситуациях:

  • Используется шаблон разработки событий.

  • Желательно инкапсулировать статический метод.

  • Вызывающему не требуется доступ к другим свойствам, методам или интерфейсам объекта для реализации метода.

  • Желательно простое построение.

  • Классу может потребоваться несколько реализаций метода.

Интерфейс следует использовать в следующих ситуациях:

  • Существует группа связанных методов, которые могут быть вызваны.

  • Классу потребуется только одна реализация метода.

  • Класс, использующий интерфейс, будет передавать этот интерфейс другим типам классов и интерфейсов.

  • Реализуемый метод связан с типом или идентификатором класса: например, методы сравнения.

Хорошим примером использования интерфейса с одним методом вместо делегата является использование IComparable или его универсальной версии IComparable<T>. IComparable объявляет метод CompareTo, который возвращает целое значение, задающее отношение "меньше", "равно" или "больше" между двумя объектами одного типа. IComparable можно использовать в качестве основы для алгоритма сортировки. В основе алгоритма сортировки можно использовать и метод сравнения делегатов, но такой подход не является оптимальным. Возможность сравнения относится к классу, а алгоритм сравнения не изменяется при выполнении, поэтому лучше использовать интерфейс с одним методом.

См. также

Ссылки

События (Руководство по программированию в C#)

Методы (Руководство по программированию на C#)

Интерфейсы (Руководство по программированию в C#)

Основные понятия

Руководство по программированию на C#