23
.NET Framework і C# Модуль 12 Делегати, події

Net framework і c# module 12

Embed Size (px)

Citation preview

Page 1: Net framework і c# module 12

.NET Framework і C#Модуль 12 Делегати, події

Page 2: Net framework і c# module 12

2

В цьому модулі: Поняття делегата Синтаксис оголошення делегата Цілі і задачі делегата Виклик декілька методів через делегат Виклик декількох методів через делегат (multicasting) Базовий клас для делегатів

◦ System.Delegate◦ System.MulticastDelegate

Події Поняття події Синтаксис оголошення подій Необхідність і особливість використання подій Використання подій для багато адресного делегата Використання подійних засобів доступу Анонімні методи

Andriy Gladkyy [email protected]

Page 3: Net framework і c# module 12

3

Поняття делегатаДелегат – це об’єкт який може посилатись на метод.

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

Andriy Gladkyy [email protected]

Page 4: Net framework і c# module 12

4

Синтаксис оголошення делегата Для оголошення делегата використовується ключове слова delegate.

Type – тип повернення DelegateName – ім’я делегата List - список параметрів, необхідних методам при виклику їх за допомогою делегата. Делегат може викликати як методи екземплярів класу так і статичні методи Делегат може приймати один з п’яти модифікаторів доступу

Andriy Gladkyy [email protected]

delegate Type DelegateName (List)

Page 5: Net framework і c# module 12

5

Andriy Gladkyy [email protected]

Демонстрація

Page 6: Net framework і c# module 12

6

Цілі і задачі делегатаДелегати використовуються в наступних

випадках:◦ При паралельному запуску декількох операцій одночасно ◦ При роботі з графічним інтерфейсом користувача

використовуються події. Ми заздалегідь не знаємо, які діє виконає користувач і відповідно які методи потрібно викликати

Делегат дозволяє визначити, який метод потрібно викликати не на етапі компіляції а на етапі виконання.

Andriy Gladkyy [email protected]

Page 7: Net framework і c# module 12

7Andriy Gladkyy [email protected]

Демонстрація

Page 8: Net framework і c# module 12

8

Виклик декількох методів через делегат (multicasting)

Коли необхідно викликати з одного делегата два чи більше методів.

Для реалізації множинного делегування делегат повинен повертати тип void.

Додавання методів до списку викликів делегата виконуються за допомогою операції +=

Видалення методів із списку викликів виконується за допомогою операції -=

Об’єднати делегати можна за допомогою операції +. Отримаємо новий делегат, який буде викликати методи об’єднаних делегатів

Andriy Gladkyy [email protected]

Page 9: Net framework і c# module 12

9Andriy Gladkyy [email protected]

Демонстрація

Розглянемо клас Circle, в якому описані чотири методи, які виводять в на консоль радіус, діаметр, довжину окружності, площу кола

Page 10: Net framework і c# module 12

10

Базові класи для делегатів System.Delegate являється базовим для типів делегатів. Однак лише

система і компілятор можуть явно наслідувати класи Delegate і MulticastDelegate. Також не можна створити

Andriy Gladkyy [email protected]

Page 11: Net framework і c# module 12

11Andriy Gladkyy [email protected]

Page 12: Net framework і c# module 12

12

System.MulticastDelegate. Будь який клас делегат наслідує System.MulticastDelegate. Це пояснює багато адресність делегатів: в ході виконання додатка об’єкт делегат здатний запам’ятати посилання на різну кількість методів не залежно від їхньої статичності, не статичності чи приналежності класам.

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

Andriy Gladkyy [email protected]

Page 13: Net framework і c# module 12

13

Поняття подіїПодія – це повідомлення про виникнення деякої дії.

Це може бути натиснення на кнопку, вибір елементу із списку і т.д.

Відправником події може бути будь який компонент форми, або сам додаток.

Відправник – це об’єкт, який генерує подію. Отримати повідомлення про подію може будь який інший об’єкт, якому це потрібно.

Andriy Gladkyy [email protected]

Page 14: Net framework і c# module 12

14

Поняття подіїДля того щоб об’єкт знав про виникнення даної

події, його потрібно підписати на цю подію. Потрібно задати метод обробник даної події.

Для реалізації події використовуються делегати. Об’єкт відправник визначає делегат, а кожний об’єкт отримувач додає свій метод обробник ланцюжок посилань делегата. Виклик ланцюжка методів здійснює об’єкт відправник, ініціює виконання всіх методів.

Andriy Gladkyy [email protected]

Page 15: Net framework і c# module 12

15

Синтаксис оголошення події Для оголошення події використовується ключове слово event.

DelegateName – ім’я використовуваного делегата EventName – ім’я події

Якщо на подію немає підписаних обробників, то вона має значення null, а її виклик викликає помилку виконання. Існує домовленість, по якій делегати обробники подій повертають тип void і мають два параметри. Перший - об’єкт відправник тип object, а другий – об’єкт, що містить інформацію і параметри події, похідний від класу EventArgs.

Розглянемо клас Person, який має метод Work() і подію, яка немає параметрів, WorkEnded, що інформує про завершення виконання роботи.

Andriy Gladkyy [email protected]

event DelegateName EventName;

Page 16: Net framework і c# module 12

16Andriy Gladkyy [email protected]

Демонстрація

Page 17: Net framework і c# module 12

17

Необхідність і особливість використання подій

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

Andriy Gladkyy [email protected]

Page 18: Net framework і c# module 12

18

Застосування подій для багато адресного делегата

Одна подія може активізувати декілька обробників, навіть якщо вини оголошені в інших об’єктах.

Створимо клас Ticker, його метод RunTicker() генерує подію TickEvent кожні 10 мс.

Andriy Gladkyy [email protected]

Page 19: Net framework і c# module 12

19Andriy Gladkyy [email protected]

Демонстрація

Page 20: Net framework і c# module 12

20

Використання подійних засобів доступу

В C# існує форма event-інструкцій, яка дозволяє використовувати засоби доступу до подій. Ці засоби доступу дають можливість керувати реалізацією списком обробників подій.

Andriy Gladkyy [email protected]

even nameDelegate nameEvent{ add { //Код додання подій в список подій } remove { //Код видалення подій із списку подій }}

Page 21: Net framework і c# module 12

21

Анонімні методиАнонімний метод – це блок коду, який приймає в

якості параметра делегат. Він має “заголовок”, який містить ключове слово delegate і список параметрів анонімного методу.

При обробці подій також можна використовувати анонімні методи.

Andriy Gladkyy [email protected]

Page 22: Net framework і c# module 12

22Andriy Gladkyy [email protected]

Демонстрація

Page 23: Net framework і c# module 12

23Andriy Gladkyy [email protected]

Реалізувати метод, який здійснює пошук елемента в масиві. Метод повинен приймати масив Object[] array, в якому повинен здійснюватись пошук, і делегат, що визначає чи являється елемент шуканим