Головна

Що об'єднує події, делегати та властивості

Весь викладений матеріал говорить про деяку схожість між подією і делегатом, між делегованих функцією і обробником. Порівняємо подія з делегатом. Припустимо, що виконується деяка подія (викликається одиночний об'єкт делегата) і на нього реагує відповідний обробник (виконується яка надається об'єктом делегата функція). Іншими словами, коли виникає деяка подія, то викликається множинний об'єкт делегата і подані ним функції-обробники реагують на цю подію. З цієї точки зору смислове призначення дій, які виконуються в результаті виникнення події, багато в чому збігається зі смисловим призначенням дій при використанні делегата. І дійсно, подія є можна розглядати як окремий випадок делегата. А чим відрізняється подія від делегата? Справа в тому що, якщо подивитися на оголошення події більш уважно, то можна легко помітити, що слово event істотно змінило вживання делегата як подія. Ця зміна полягає в тому, що чарівне слово event змушує компілятор внести в код щось, що робить подію відмінним від делегата. В результаті об'єкт-делегата, перетворений в об'єкт-подія, вже можна викликати тільки всередині того екземпляра класу, в якому цей делегат-подія була оголошена.

Таким чином подія стає приналежністю конкретного об'єкта. А подія, що виникає всередині такого об'єкта "відсилається" до інших об'єктів, які реагують на яке прийшло до них подія за допомогою своїх обробників, пов'язаних саме з тим об'єктом, в якому ця подія виникло.

Тут важливо відзначити той факт, що оскільки подія пов'язана з певним об'єктом, то і обробники інших об'єктів тісно пов'язані з цим конкретним подією і відповідно - з його об'єктом. Тобто має місце жорстка фіксація зв'язку між подією і тими обработчиками, які повинні виконуватися при генеруванні цієї події.

Також як і у випадку делегата, перш ніж оголошувати подія, необхідно оголосити делегат події. Делегат події визначає формат функції - обробника події. Ті, що підписалися на подію обробники всіх його передплатників повинна відповідати цьому формату, тобто мати один і той же список типів параметрів і тип значення. Делегат події може бути оголошений поза класом об'єкта, якщо він потрібний для класів інших об'єктів або використовується самостійно. Але можна оголосити делегат події і в класі об'єкта, в якому буде генеруватися подія. Якщо подія важлива і часто використовується багатьма програмістами, то для нього створюють свій власний делегат і клас для об'єкта даних цієї події. Наприклад, для широко використовуваного події OnMouseDown натискання на кнопку миші створений делегат MouseEventHandler і клас MouseEventArgs для даних.

Давайте порівняємо оголошення властивості, делегата і події



Класи з великим числом подій | Завдання на лабораторну роботу

Події. | Використання подій в компонентах .NET. | оголошення події | Використання події | Багатоцільова обробка події. | Використання подій в компонентах .NET |

© um.co.ua - учбові матеріали та реферати