Какие преимущества дает использование системы событий C # для реализации шаблона Publisher / Subscriber вместо реализации его с интерфейсами классов? - PullRequest
1 голос
/ 06 февраля 2011

Здесь показана реализация: http://msdn.microsoft.com/en-us/library/w369ty8x.aspx

Какие преимущества перед простой реализацией этого шаблона проектирования классическим способом с интерфейсами классов?

Например, где находится разделение, поскольку у вас есть тесная прямая связь между подписчиками и издателем с помощью инструкции:

pub.RaiseCustomEvent += HandleCustomEvent;

Так что в этом случае я не вижу никакого преимущества в разделениинад прямой классической реализацией.

Ответы [ 2 ]

2 голосов
/ 06 февраля 2011

Опять же, удобство:

С интерфейсами вы должны:

  • получить из интерфейса
  • реализовать обратные вызовы (все из них!), Даже если выне нужно какое-то событие
  • регистр

С событиями все делается в одну строку, и .NET автоматически обрабатывает несколько перехватов для одного события.

2 голосов
/ 06 февраля 2011

Удобство - важная вещь, тем более что C # не имеет внутренних классов Java; поскольку это будет интерфейс с одним методом, это позволяет выполнять тривиальную подписку - возможно, с помощью метода типа, но, возможно, даже встроенного:

pub.RaiseCustomEvent += delegate { DoSomething(); };

Выше также учитывается полный лексический захват любых переменных и т. Д. (В отличие от Java, который фиксирует значения любых переменных, а не самих переменных, поэтому возможна двусторонняя связь).

Чтобы сделать это с помощью интерфейса, мне нужно было бы объявить новый класс, реализовать интерфейс, предоставить метод для обеспечения реализации и обработать любую передачу переменной / захвата.

События также позволяют транслировать нескольким абонентам очень удобным способом.

Делегатов также легче создавать во время выполнения (для метапрограммирования и т. Д.), Чем для классов - например, я могу создать делегата (с нуля) во время выполнения и подписаться на него довольно легко, используя либо DynamicMethod (если мне интересно IL) или Expression (если мне нравится AST). Создать тип и реализовать интерфейс - это немного больше работы (AssemblyName, AssemblyBuilder, ModuleBuilder, TypeBuilder и, по крайней мере, 2 Type с и MethodInfo с).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...