Світлофор односторонній: світить тільки водієві, пішохід орієнтується на водія.
Класи: Driver (водій), Pedestrian (пішохід), TrafficLight (світлофор) і Program (тестує)
В класі TrafficLight виникає два чергуються статичних події:
Поле: ім'я водія.
Обробник події Event1: Виводить повідомлення: Ім'я водія, їжу. Проїхав водій відписується від обох подій.
Обробник події Event2: Виводить повідомлення: Ім'я водія, стою.
Поле: ім'я пішохода.
Обробник події Event1: Виводить повідомлення: Ім'я пішохода, стою.
Обробник події Event2: Виводить повідомлення: Ім'я пішохода, йду. Минулий пішохід відписується від обох подій.
Обробник події Event1: Зеленим кольором виводить повідомлення: Горить зелене світло.
Обробник події Event2: Червоним кольором виводить повідомлення: Горить червоне світло.
Метод з параметром (ціле число), по черзі генерує або подія Event1 (якщо число парне) або подія Event2 (якщо число непарне)
Порядок написання коду програми:
Підготуємо ці три простих класу:
Клас TrafficLight і його методи:
ChangeLight (int i) - метод, в якому буде змінюватися світло. Цей метод подія генерує, але ми його поки не описуємо. Ставимо заглушку.
Red () -обработчік події горить червоний
Green () - обробник події горить зелений
Два інших класу (з іменами Driver і Pedestrian) теж повинні реагувати на виникнення події
В класі Driver:
Поле name, два конструктора, і два обробника подій:
В класі Pedestrian:
Поле name, два конструктора, і два обробника подій:
В класі TrafficLight , в якому виникає подія, конструюємо його.
Спочатку визначаємо за методами, які повинні спрацювати при виникненні події, їх сигнатуру.
Наше подія буде оброблятися шістьма методами, по два в кожному класі. Ми повинні подивитися сигнатури цих методів (тобто подивитися заголовки), і скласти на основі цих сигнатур делегати.
У наших оброблювачів сигнатури однакові: немає вихідного значення і немає параметрів. Тому делегат буде один.
Визначаємо делегат (назвемо його Hadler). Наведемо на його основі дві події Event1 і Event2. Далі генеруємо події в коді:
Подія створено. Методи, які викличуть цю подію, визначені по сигнатурам і на їх основі створено делегат. Подія, в свою чергу, створено на основі делегата.
Тепер покажемо, які методи в класах повинні викликатися у відповідь на подію.
Повернемося в точку входу програми main і створимо об'єкт класу TrafficLight. Підпишемо цей об'єкт на обидві події.
Тепер потрібно підписати на ці події пішоходів і водіїв. Їх може бути кілька. Кожен з них це об'єкт з іншим ім'ям. Тому створювати їх, і підписувати їх на події, потрібно в циклі. Нехай їх буде 5. Отримаємо:
В процесі написання програми у нас не повинно бути жодної помилки. Якщо помилка виникла, потрібно відразу з'ясовувати причину.
Виконаємо відпрацювання:
Спостерігаємо дивну ситуацію: Водій 1, який повинен був виїхати на зелене світло, залишився на нашому перехресті. Те ж саме з пішоходами. Пішоходи нікуди не йдуть, водії нікуди не їдуть.
Це відбувається тому, що кожен з них як і раніше підписаний на обидві події. А нам потрібно, щоб:
Тобто це має відбуватися в їх класах. Для пішохода в методі Go класу Pedestrian. Для водія в методі Ride класу Driver.
Але в цих класах у нас немає об'єкта svet світлофор, від якого потрібно відписуватися. Тому доведеться в цьому випадку (далеко не завжди це потрібно) події зробити статичними. Це дасть нам можливість, при підписці і її анулювання не вказувати ім'я об'єкта, а вказувати ім'я класу.
В класі TrafficLight, опишемо події, як статичні.
Відразу з'явиться багато помилок в якому тестують класі. Тому що наше подія ми приєднували до об'єкта, а не до класу. А статичну подія не приєднують до об'єкта. Тому відразу виправимо ці помилки в класі Program. Скрізь svet.Event1 поміняємо його на TrafficLight.Event1, а svet.Event2 поміняємо його на TrafficLight.Event2.
Від статичних подій можна відписатися в будь-якому місці проекту.
Нам потрібно, щоб пішохід перейшов дорогу і пішов, тобто не реагував на світлофор. Тобто відразу після переходу вулиці, в методі Go в класі Pedestrian потрібно відписатися від подій пов'язаних зі світлофором:
Нам потрібно, щоб водій перетнув перехрестя і виїхав, тобто не реагував на світлофор. Тобто відразу після перетину перехрестя, в методі Ride в класі Driver потрібно відписатися від подій пов'язаних зі світлофором:
Результат:
Класи: Car (машина), Parking (стоянка) - генеруються дві події, Sequrity (охоронець) -обработчік події, Police (поліція) обробники двох подій і Program (тестує)
В класі Parking виникає два статичних події:
Відпрацювання 1: виникло тільки подія NotPlaces.
Відпрацювання 2: виникло подія NotPlaces і 3 рази виникло подія SignalTriggered.
Поле: номер машини
Властивість для читання поля номер машини
Конструктор з параметром.
Поле: ім'я
Властивості для читання поля ім'я.
Конструктор з параметрoм.
Обробник події NotPlaces:
Поле: ім'я
Свойствo для читання поля ім'я.
Конструктор з параметрами.
Обробник події NotPlaces:
Обробник події SignalTriggered:
Події виникають в цьому класі. Тому тут описуються і події і відповідні їм делегати. Події статичні, так як відбуваються в цьому класі, а відписувався від них в інших класах.
Делегатів два, так як у їх обробників різна сигнатура: один тип без параметрів і без значення, що повертається, другий з цілим параметром і без значення, що повертається.
Поля: адреса стоянки, кількість місць, List Властивість для читання поля - чи є місця.
Конструктор з параметрами.
Метод, в якому виникає подія NotPlaces і подія SignalTriggered
Створимо об'єкти трьох класів: parking, sequrityMan, polisMan
підпишіться на події.
На подія NotPlaces підпишемо об'єкти sequrityMan і polisMan
На подія SignalTriggered підпишемо об'єкт polisMan
Так як події статичні, то застосовуємо їх не об'єкту, а до класу.
В циклі, поки у об'єкта parking значення логічного поля = true (місця є), виконуємо:
Лямбда вирази - це анонімні функції, за допомогою яких можна дуже сильно спростити текст коду. Наприклад, з використанням лямбда виразів можно одним рядком коду знайти суму елементів колекцій, знайти максимум або мінімум, а також зробити вибірку з масиву і навіть передати отримані результати в метод.Лямбда вираження для колекцій є по суті аналогом SQL запитів до баз даних.
З колекції класу Employee вибираються і виводяться на екран учасники проекту старше 16 років., Але молодше 46 років.
В колекції класу Employee знаходимо і виводяться на екран найстаршого учасника.
Клас Program (тестує)
Приклад 3
Лямбда вирази