Единственными реальными преимуществами делегатов над интерфейсами являются
- Делегаты могут иметь дело с различными типами аргументов даже до того, как .Net поддерживает обобщенные типы.
- Класс может создавать делегатов, представляющих несколько различных методов, совместно использующих одну и ту же сигнатуру;замена делегатов интерфейсами будет означать, что каждый класс может предоставлять один метод, который реализует каждый интерфейс в стиле делегата без создания вспомогательных классов, но для каждой дополнительной реализации потребуется вспомогательный класс.
Когда .net не поддерживает обобщенные элементы, делегаты были существенной частью этого, так как объявление отдельных неуниверсальных интерфейсов для каждой подписи каждой функции, которую нужно передать, было бы неработоспособным.Если бы .net поддерживал дженерики с самого начала, делегаты не были бы необходимы, за исключением определенных сценариев, включающих Reflection, и даже там, возможно, было бы наиболее полезно иметь тип Action<T,U>
, являющийся реализацией IAction<T,U>
(чтобыкод, которому просто нужно что-то, что он может Invoke
будет использовать интерфейс).Подход на основе интерфейса потребовал бы создания классов с одним методом в тех случаях, когда классам необходимо создавать делегаты, представляющие несколько методов, но исключил бы необходимость создания отдельных экземпляров делегатов во многих распространенных случаях, когда число методовзаданная подпись должна быть точно одна.
Кстати, замена делегатов интерфейсами никоим образом не помешает созданию универсального метода Combine.Действительно, ковариация интерфейса может заставить такой метод работать лучше, чем существующий Delegate.Combine
во многих отношениях.Реализация метода, аналогичного Delegate.Remove
, была бы в лучшем случае неуклюжей и раздражающей, но я не могу думать ни о какой другой ситуации, кроме управления подпиской на события, которая потребовала бы использования Delegate.Remove
, и подписка на события в любом случае могла бы лучше всего выполняться с использованием других подходов.