Да, вы можете использовать интерфейс с одним методом вместо делегата. Вам также понадобится реализация многоадресной природы делегатов, как с точки зрения добавления / удаления, так и вызова. Однако было бы сложно иметь класс single , реализующий многоадресную передачу, а также реализовывать Invoke
безопасным для типов образом, поскольку интерфейсы имеют разные числа и типы параметров. Конечно, их может быть несколько: Multicast<T>
, Multicast<T1, T2>
и т. Д. (Вероятно, тот же класс будет обрабатывать и асинхронное выполнение.)
Другая боль в шее заключается в том, что вы можете реализовать интерфейс только один раз для каждого класса, даже если вам нужно несколько разных обработчиков - так что у вас будет много вложенных классов.
Мало, что особенно волшебно в отношении делегатов - это просто очень полезная абстракция, а с синтаксическим сахаром лямбда-выражений, анонимных методов и деревьев выражений они даже лучше.