Рассмотрите событие как интерфейс обратного вызова, где интерфейс имеет только один метод.
только крюк события вам нужно
С событиями, вам нужно только реализовать обработчик для событий вы заинтересованы в обращении. В шаблоне интерфейса наблюдателя вам необходимо реализовать все методы во всем интерфейсе, в том числе внедрить тела методов для типов уведомлений, которые вам действительно не нужны. В вашем примере вам всегда нужно реализовывать OnFoundDirectory и OnFoundFile, даже если вы беспокоитесь только об одном из этих событий.
Меньше обслуживания
Другая хорошая вещь о событиях, что вы можете добавить новый к определенному классу, так что он поднимет его, и вам не придется менять каждый существующий наблюдатель. Если вы хотите добавить новый метод в интерфейс, вам нужно обойти все классы, которые уже реализуют этот интерфейс и внедряют новый метод во всех них. Однако с событием вам нужно только изменить существующие классы, которые действительно хотят что-то сделать в ответ на новое событие, которое вы добавляете.
Шаблон построен на язык, так что все знают, как использовать его
События являются идиоматическое, в том, что когда вы видите событие, вы знаете, как использовать его. С интерфейсом наблюдателя люди часто реализуют различные способы регистрации для получения уведомлений и подключения наблюдателя .. с событиями, хотя, как только вы научитесь регистрировать и использовать один (с оператором + =), остальные - все одна и та же.
Pros для интерфейсов
Я не получил много плюсов для интерфейсов. Я предполагаю, что они заставляют кого-то внедрять все методы в интерфейсе. Но вы не можете заставить кого-то правильно использовать все эти методы, поэтому я не думаю, что в этом есть большая ценность.
Синтаксис
Некоторые люди не нравится, как вы должны объявить тип делегата для каждого события. Кроме того, стандартные обработчики событий в инфраструктуре .Net имеют следующие параметры: (отправитель объекта, аргументы EventArgs). Поскольку отправитель не указывает конкретный тип, вы должны использовать его, если хотите его использовать. Это часто бывает на практике, если вы чувствуете себя не совсем правильно, потому что теряете защиту системы статического типа. Но, если вы реализуете свои собственные события и не следуете рамочному соглашению .Net, вы можете использовать правильный тип, поэтому потенциальное понижающее литье не требуется.
Небольшой интерфейс для интерфейсов заключается в том, что, когда у вас много событий, которые обычно объединяются, вам не нужно регистрировать их все в огромном блоке событий + = s, но регистрировать только один интерфейс. Я все же предпочитаю события, хотя, конечно :) – configurator
Один из событий для событий - это то, что они не срабатывают через домены приложений. Если приложение является (или будет) сложным, это станет проблемой. – TMN
События хороши для фреймворков, потому что они обычно не меняются часто, и к тому времени, когда люди начинают их использовать, они должны быть относительно стабильными. Это может быть не так при разработке приложения с быстро меняющимися спецификациями. Предположим, что поведение класса меняется и требует нового события. Вам нужно будет изучить каждое использование этого класса. Используя интерфейс наблюдателя, компилятор сообщит вам, где требуется внимание, но если вы используете события, вам будет гораздо труднее время. – Christo