Использование делегатов вместо интерфейсов (Руководство по программированию в C#)
И делегаты, и интерфейсы позволяют конструктору классов отделять объявление типов от реализации. Определенный интерфейс может быть унаследован и реализован любым классом или структурой. Делегат может быть создан для метода в любом классе, если метод соответствует сигнатуре метода для делегата. Ссылка на интерфейс или делегат могут быть использованы объектом, не имеющим данных о классе, реализующем интерфейс или метод делегата. Учитывая эти сходные признаки, когда в конструкторе классов следует использовать делегат, а когда следует использовать интерфейс?
Делегат следует использовать в следующих ситуациях:
Используется шаблон разработки событий.
Желательно инкапсулировать статический метод.
Вызывающему не требуется доступ к другим свойствам, методам или интерфейсам объекта для реализации метода.
Желательно простое построение.
Классу может потребоваться несколько реализаций метода.
Интерфейс следует использовать в следующих ситуациях:
Существует группа связанных методов, которые могут быть вызваны.
Классу потребуется только одна реализация метода.
Класс, использующий интерфейс, будет передавать этот интерфейс другим типам классов и интерфейсов.
Реализуемый метод связан с типом или идентификатором класса: например, методы сравнения.
Хорошим примером использования интерфейса с одним методом вместо делегата является использование IComparable или его универсальной версии IComparable<T>. IComparable объявляет метод CompareTo, который возвращает целое значение, задающее отношение "меньше", "равно" или "больше" между двумя объектами одного типа. IComparable можно использовать в качестве основы для алгоритма сортировки. В основе алгоритма сортировки можно использовать и метод сравнения делегатов, но такой подход не является оптимальным. Возможность сравнения относится к классу, а алгоритм сравнения не изменяется при выполнении, поэтому лучше использовать интерфейс с одним методом.
См. также
Ссылки
События (Руководство по программированию в C#)
Методы (Руководство по программированию на C#)
Интерфейсы (Руководство по программированию в C#)