Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лр2_События_б.doc
Скачиваний:
6
Добавлен:
16.08.2019
Размер:
152.58 Кб
Скачать

1.7. Что объединяет события, делегаты и свойства

Весь изложенный материал говорит о некоторой схожести между событием и делегатом, между делегируемой функцией и обработчиком. Сравним событие с делегатом. Допустим, что выполняется некоторое событие (вызывается одиночный объект делегата) и на него реагирует соответствующий обработчик (выполняется представляемая объектом делегата функция). Другими словами, когда возникает некоторое событие, то вызывается множественный объект делегата и представленные им функции-обработчики реагируют на данное событие. С этой точки зрения смысловое назначение действий, выполняемых в результате возникновения события, во многом совпадает со смысловым назначением действий при использовании делегата. И действительно, событие является можно рассматривать как частный случай делегата. А чем отличается событие от делегата? Дело в том что, если посмотреть на объявление события более внимательно, то можно легко заметить, что слово event существенно изменило употребление делегата в качестве события. Это изменение заключается в том, что волшебное слово event заставляет компилятор внести в код нечто, что делает событие отличным от делегата. В результате объект-делегата, превращённый в объект-событие, уже можно вызвать только внутри того экземпляра класса, в котором этот делегат-событие был объявлен.

Таким образом событие становится принадлежностью конкретного объекта. А событие, возникающее внутри такого объекта "отсылается" к другим объектам, которые реагируют на пришедшее к ним событие с помощью своих обработчиков, связанных именно с тем объектом, в котором это событие возникло.

Здесь важно отметить тот факт, что поскольку событие связано с определённым объектом, то и обработчики других объектов тесно связаны с этим конкретным событием и соответственно - с его объектом. То есть имеет место жесткая фиксация связи между событием и теми обработчиками, которые должны выполняться при генерировании этого события.

Также как и в случае делегата, прежде чем объявлять событие, необходимо объявить делегат события. Делегат события определяет формат функции - обработчика события. Подписавшиеся на событие обработчики всех его подписчиков должна соответствовать этому формату, то есть иметь один и тот же список типов параметров и тип возвращаемого значения. Делегат события может быть объявлен вне класса объекта, если он требуется для классов других объектов или используется самостоятельно. Но можно объявить делегат события и в классе объекта, в котором будет генерироваться событие. Если событие важно и часто используется многими программистами, то для него создают свой собственный делегат и класс для объекта данных этого события. Например, для широко используемого события OnMouseDown нажатия на клавишу мыши создан делегат MouseEventHandler и класс MouseEventArgs для данных.

Давайте сравним объявление свойства, делегата и события

Объявление свойства

int x; // переменная

public int posX // объявление свойства – представителя переменной обычного типа

{

set{ x=value; } // методы доступа к

get{ return x; } // переменной, представляемой свойством

}