Java имеет хороший: Semantic Diff Utilities
Мне кажется, что хороший пример того, где частное событие полезно, - это создание компонента / элемента управления, часто у вас может быть компонент, состоящий из 1 или более других компонентов, частных событий компоненты, на которые можно подписаться, - это удобная и простая реализация шаблона наблюдателя.
Изменить:
Позвольте мне привести пример ...
Допустим, вы пишете элемент управления типа Grid, и внутри этого элемента управления у вас, скорее всего, будет куча содержащихся классов, которые создаются динамически, например, строки, столбцы, заголовки и т. вы не обязательно хотите показывать как событие пользователям сетки, здесь удобны частные события,просто имейте один или два обработчика, и когда вы создаете каждый экземпляр своей строки или столбца или что-то еще, прикрепите обработчик, так как в противном случае вам просто нужно написать свой собственный механизм наблюдателя, не сложно, но почему, когда вам не нужно, и вы можете просто использовать многоадресные события.
Вот немного странный, но реальный сценарий, который я однажды реализовал. У вас есть половинки частичного класса, созданные машиной или пользователем. Сгенерированная машиной половина содержит код, который желает информировать сгенерированную пользователем половину, когда происходит какое-либо событие. Но созданная пользователем половина может не заботиться ни о чем, а может делать довольно много. Кажется грубым со стороны сгенерированной машиной половины требовать, чтобы сгенерированная пользователем половина реализовывала определенный метод для обработки сообщения, которое они не заинтересованы в прослушивании.
Чтобы решить эту проблему, сгенерированная машиной половина могла стрелять на частном мероприятии. Если пользовательская половина заботится о ней, она может подписаться на событие. В противном случае он может проигнорировать его.
Этот сценарий теперь более элегантно рассматривается с помощью частичных методов в C # 3,
Вложенные типы имеют доступ к закрытым и защищенным событиям включающего типа. Я использовал эту функцию для уведомления дочерних элементов управления (вложенного типа) об изменениях состояния родительского элемента управления (включающего типа) в приложении Silverlight.
Извините, что перетащил старую ветку, но я безнаказанно использую частные мероприятия в одном из моих проектов, и лично я считаю, что это хороший способ решить проблему дизайна:
Вот сокращенный код:
public class MyClass
{
private event EventHandler _myEvent;
public ExternalObject { get; set; }
public event EventHandler MyEvent
{
add
{
if (_myEvent.GetInvocationList().Length == 0 && value != null)
ExternalObject.ExternalEvent += HandleEvent;
_myEvent+= value;
}
remove
{
_myEvent-= value;
if (_myEvent.GetInvocationList().Length == 0)
ExternalObject.ExternalEvent -= HandleEvent;
}
}
private void HandleEvent(object sender, EventArgs e)
{
_myEvent.Raise(this, EventArgs.Empty); // raises the event.
}
}
По сути, MyEvent
всегда вызывается только в обработчике событий ExternalObject.ExternalEvent
, поэтому, если нет обработчиков для MyEvent
], то мне не нужно прикреплять обработчик к внешнему событию, что немного ускоряет код за счет сохранения кадра стека.