Stronę tą wyświetlono już: 3547 razy
Wstęp
Wyobraźmy sobie taką oto sytuację, że utworzony został pewien zbiór obiektów geometrycznych, z których każdy może się przemieszczać w pewnej funkcji czasu i gdy piszę, że może to znaczy że obiekt ten nie musi koniecznie się przemieszczać. A więc, jeżeli przemieszczenie obiektu jest zerowe to obiekt się nie przemieszcza, a jeżeli jest różne od zera to się przemieszcza. Przemieszczenie obiektu nazwijmy sobie zdarzeniem, w reakcji na to zdarzenie obiekt wywołuje pewien zbiór funkcji, tak zwanych delegatów, które mają za zadanie poinformować wszystkie inne obiekty o tym, że ten konkretny obiekt się przemieścił. W odpowiedzi na to każdy z pozostałych obiektów sprawdza, czy nie nastąpiła jego kolizja z obiektem wysyłającym
Najczęściej zdarzenia będą spotykane przy tworzeniu programów okienkowych w C#, np zdarzenie Click dla przycisku.
Delegaty i zdarzenia
W poniższym przykładzie wykorzystałem wcześniej już opisywaną na stronie Programowanie → Podstawy C# → Obsługa operatorów struktur i klas definicję klasy Point2D. Poniżej zamieszczam przykład zastosowania delegacji i zdarzeń:
W powyższym kodzie utworzony został typ delegacji collision (kolizja), który określa jaki typ metod może on przechowywać, ponieważ w przypadku, gdy dany delegat zwraca typ void to taki delegat przechowuje listę metod, które w reakcji na jego wywołanie kolejno będą wywoływane. Utworzenie zdarzenia ma miejsce wewnątrz klasy i jest ono ściśle powiązane z utworzeniem obiektu delegacji z wykorzystaniem słowa kluczowego event (zdarzenie). Klasa circle będzie wywoływała zdarzenie col, gdy dojdzie do przemieszczenia tegoż obiektu w celu obsłużenia wykrycia i reakcji na ewentualną kolizję.
A oto kod, który wywołuje odpowiedź na zdarzenie col:
Wynik działania powyższego kodu jest następujący:
okrąg o współrzędnych: x = 7; y = 0; i promieniu r = 10 koliduje z okrągiem o współrzędnych: x = 10; y = 0; i promieniu r = 10 brak zderzenia
Możliwe jest również usunięcie danej metody z listy zdarzeń za pomocą operatora -=. Dodatkowo można utworzyć delegację, która zwraca jakąś wartość, w takim przypadku obiekt takiego delegata nie może przyjmować listy metod a jedynie jedną metodę.