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