Назад Уперед Зміст

Приклад 1

Проект «Світлофор»

Світлофор односторонній: світить тільки водієві, пішохід орієнтується на водія.

Класи: Driver (водій), Pedestrian (пішохід), TrafficLight (світлофор) і Program (тестує)

В класі TrafficLight виникає два чергуються статичних події:

  1. Event1. Горить зелене світло.
  2. Event2. Горить червоне світло.

Клас Driver (водій)

Поле: ім'я водія.

Обробник події Event1: Виводить повідомлення: Ім'я водія, їжу. Проїхав водій відписується від обох подій.

Обробник події Event2: Виводить повідомлення: Ім'я водія, стою.

Клас Pedestrian (пішохід)

Поле: ім'я пішохода.

Обробник події Event1: Виводить повідомлення: Ім'я пішохода, стою.

Обробник події Event2: Виводить повідомлення: Ім'я пішохода, йду. Минулий пішохід відписується від обох подій.

Клас TrafficLight (світлофор)

Обробник події Event1: Зеленим кольором виводить повідомлення: Горить зелене світло.

Обробник події Event2: Червоним кольором виводить повідомлення: Горить червоне світло.

Метод з параметром (ціле число), по черзі генерує або подія Event1 (якщо число парне) або подія Event2 (якщо число непарне)

Порядок написання коду програми:

1. Моделювання ситуації

Підготуємо ці три простих класу:

Клас TrafficLight і його методи:  

ChangeLight (int i) - метод, в якому буде змінюватися світло. Цей метод подія генерує, але ми його поки не описуємо. Ставимо заглушку.

Red () -обработчік події горить червоний

Green () - обробник події горить зелений

Два інших класу (з іменами Driver і Pedestrian) теж повинні реагувати на виникнення події

В класі Driver:

Поле name, два конструктора, і два обробника подій:

В класі Pedestrian:

Поле name, два конструктора, і два обробника подій:

2. Оформлення події.

В класі TrafficLight , в якому виникає подія, конструюємо його.

Спочатку визначаємо за методами, які повинні спрацювати при виникненні події, їх сигнатуру.

Наше подія буде оброблятися шістьма методами, по два в кожному класі. Ми повинні подивитися сигнатури цих методів (тобто подивитися заголовки), і скласти на основі цих сигнатур делегати.

У наших оброблювачів сигнатури однакові: немає вихідного значення і немає параметрів. Тому делегат буде один.

Визначаємо делегат (назвемо його Hadler). Наведемо на його основі дві події Event1 і Event2. Далі генеруємо події в коді:

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

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

3. Підписка

Повернемося в точку входу програми main і створимо об'єкт класу TrafficLight. Підпишемо цей об'єкт на обидві події.

Тепер потрібно підписати на ці події пішоходів і водіїв. Їх може бути кілька. Кожен з них це об'єкт з іншим ім'ям. Тому створювати їх, і підписувати їх на події, потрібно в циклі. Нехай їх буде 5. Отримаємо:

В процесі написання програми у нас не повинно бути жодної помилки. Якщо помилка виникла, потрібно відразу з'ясовувати причину.

Виконаємо відпрацювання:

Спостерігаємо дивну ситуацію: Водій 1, який повинен був виїхати на зелене світло, залишився на нашому перехресті. Те ж саме з пішоходами. Пішоходи нікуди не йдуть, водії нікуди не їдуть.

Це відбувається тому, що кожен з них як і раніше підписаний на обидві події. А нам потрібно, щоб:

  1. водії відписувалися від обох подій, коли їдуть,
  2. пішоходи відписувалися від обох подій, коли переходять дорогу.

Тобто це має відбуватися в їх класах. Для пішохода в методі Go класу Pedestrian. Для водія в методі Ride класу Driver.

Але в цих класах у нас немає об'єкта svet світлофор, від якого потрібно відписуватися. Тому доведеться в цьому випадку (далеко не завжди це потрібно) події зробити статичними. Це дасть нам можливість, при підписці і її анулювання не вказувати ім'я об'єкта, а вказувати ім'я класу.

В класі TrafficLight, опишемо події, як статичні.

Відразу з'явиться багато помилок в якому тестують класі. Тому що наше подія ми приєднували до об'єкта, а не до класу. А статичну подія не приєднують до об'єкта. Тому відразу виправимо ці помилки в класі Program. Скрізь svet.Event1 поміняємо його на TrafficLight.Event1, а svet.Event2 поміняємо його на TrafficLight.Event2.

Від статичних подій можна відписатися в будь-якому місці проекту.

Нам потрібно, щоб пішохід перейшов дорогу і пішов, тобто не реагував на світлофор. Тобто відразу після переходу вулиці, в методі Go в класі Pedestrian потрібно відписатися від подій пов'язаних зі світлофором:

Нам потрібно, щоб водій перетнув перехрестя і виїхав, тобто не реагував на світлофор. Тобто відразу після перетину перехрестя, в методі Ride в класі Driver потрібно відписатися від подій пов'язаних зі світлофором:

Результат:

Приклад 2

Проект «Автостоянка»

Класи: Car (машина), Parking (стоянка) - генеруються дві події, Sequrity (охоронець) -обработчік події, Police (поліція) обробники двох подій і Program (тестує)

В класі Parking виникає два статичних події:

  1. Подія NotPlaces. Виникає, коли на стоянці немає місць. Делегат NotPlacesEventHandler. На подію підписуються класи Sequrity і Police. Охоронець закриває стоянку. Поліцейський включає відеоспостереження.
  2. Подія SignalTriggered. Спрацювала сигналізація на стоянці. Подія виникає випадково. Делегат SignalTriggeredEventHandler (int k). Параметр k лічильник спрацьовувань. На подію підписується клас Police. Поліцейський приїжджає на стоянку, після кожного спрацьовування.

    Відпрацювання 1: виникло тільки подія NotPlaces.

    Відпрацювання 2: виникло подія NotPlaces і 3 рази виникло подія SignalTriggered.

    Клас Car

    Поле: номер машини

    Властивість для читання поля номер машини

    Конструктор з параметром.

    Клас Sequrity (охоронець)

    Поле: ім'я

    Властивості для читання поля ім'я.

    Конструктор з параметрoм.

    Обробник події NotPlaces: