CentrumXP.pl » Witamy
CentrumXP.pl
 
Szukaj
Subskrypcja
Powiadomienie e-mailem o nowościach na CentrumXP.pl:
E-mail: Zapisz
Czy zamierzasz pobrać Internet Explorer 9?


CentrumXP.pl » Microsoft .NET » Kurs C#, cz. II » Dodaj do ulubionych Dodaj do ulubionych   Dodaj do ulubionych Wersja do wydruku

17. Delegaty i zdarzenia

Autor: Paweł Kruczkowski    Opublikowano: 16 stycznia 2007    Odsłon: 98255    »Skomentuj...
Strona:
Zobacz również:

01. Zmienne, stałe, wyrażenia i odstępy w C# 2.0

02. Usuwanie obiektów

03. Przekazywanie parametrów

04. Przeciążanie metod i konstruktorów

05. Hermetyzacja danych

06. Dziedziczenie i polimorfizm

07. Abstrakcja w C#

08. Porozmawiajmy o klasach

09. Struktury

10. Interfejsy, część 1

11. Interfejsy, część 2

12. Słowniki w C# 2.0

13. Łańcuchy w C# 2.0

14. Wyrażenia regularne

15. Wyjątki - część I

16. Wyjątki - część II

18. Operacje wejścia - wyjścia cz.1

19. Operacje wejścia - wyjścia cz. 2

20. Atrybuty i mechanizm refleksji

»Uzyskaj pomoc na forum

Tematem niniejszego artykułu są delegaty i zdarzenia. Są to dwa ściśle ze sobą powiązane pojęcia, o których warto parę słów napisać.

Najłatwiej wprowadzić się w świat delegatów wyobrażając sobie prezydenta Polski, który z braku czasu nie może osobiście uczestniczyć w uroczystościach prezydenta Stanów Zjednoczonych, pomimo faktu, że został on na nie zaproszony. Wówczas prezydent Polski wysyła do swojego kolegi zza oceanu kogoś upoważnionego (np. premiera). Nadaje mu pewne prawa (premier ma obowiązek reprezentować Polskę), nakazuje mu przekazać ciepłe słowa w postaci podziękowania za zaproszenie i…przeproszenia za brak udziału J (będą to parametry delegata) oraz  oczekuje, że prezydent Stanów Zjednoczonych będzie jednak zadowolony z obecności „tylko” premiera znad Wisły.

W takiej sytuacji – premier Polski jest delegatem.

Bardzo często spotkamy się w naszych programach z sytuacją, w której nasz program wykonuje jakieś działanie, ale nie wie jakich obiektów a nawet metod ma w tym celu użyć. Na przykład: naciśnięcie przycisku ma poinformować inny obiekt, że przycisk został przyciśnięty. Ale jaki to obiekt? Nie wiadomo, dlatego najlepszym rozwiązaniem jest połączenie tego przycisku z delegatem, który następnie w czasie wykonywania się programu wywoła odpowiednią metodę.

Wiemy już mniej więcej do czego służą delegaty, ale tematem dzisiejszego artykułu są również zdarzenia. Nie jest to przypadkowe, bowiem są one często właśnie razem z delegatami spotykane w programach. Możemy powiedzieć więcej, delegaty i zdarzenia są ściśle powiązane ze sobą, ponieważ delegat  potrafi obsługiwać zdarzenie.

A co to jest zdarzenie? Zdarzenie to pojęcie określające, że „coś się wydarzyło” w naszym programie, np. kliknięcie przycisku jest chyba najprostszym zdarzeniem jakie możemy osiągnąć w naszej aplikacji.

Delegaty to obiekty, w pełni obsługiwane przez język C# 2.0. Z punktu widzenia programisty delegat to typ referencyjny, który stanowi interfejs metody o odpowiedniej sygnaturze oraz zwracanym typie. Poniżej prezentujemy sposób deklarowania delegatów:

public delegate string MojDelegat(object mojObjekt1, object MojObject2);

A więc delegat tworzymy używając słowa kluczowego delegate, po którym znajduje się sygnatura metod, których interfejsem może być dany delegat.

W powyższym fragmencie kodu utworzyliśmy więc delegat o nazwie MojDelegat, który może zawierać dowolną metodę przyjmującą jako parametry 2 obiekty i zwracającą ciąg łańcuchów (string).

Do zapamiętania: delegat używamy do wywołania metody, którą on zawiera. Nieistotne jest, czy w danej chwili delegat zawiera metodę składową (tworzymy następnie egzemplarz tej metody, która zwraca odpowiedni typ i ma odpowiednią sygnaturę), czy używa metod anonimowych (o nich w niniejszym artykule też napiszemy parę słów) - istotne bowiem, że delegat metody te potrafi wywołać.

Napiszmy więc pierwszy przykład, który będzie prezentować sposób używania delegatów:

public class Delegaty
{
    public delegate int MojDelegat(int a, int b);         
   
    public int Dodaj(int a, int b)
    {
        return a + b;
    }
 
    public int Odejmij(int a, int b)
    {
        return a - b;
    }
 
    public int Pomnoz(int a, int b)
    {
        return a * b;
    }
 
    public int Podziel(int a, int b)
    {
        return a / b;
    }
}
 
class Glowna
{
    static void Main() 
    {
        Delegaty d = new Delegaty();
       

  Delegaty.MojDelegat dodawanie = new Delegaty.MojDelegat(d.Dodaj);
        int wynikDodawania = dodawanie(4, 6);
        System.Console.WriteLine("Wynik dodawania wynosi: {0}.", wynikDodawania.ToString());
 
        Delegaty.MojDelegat odejmowanie = new Delegaty.MojDelegat(d.Odejmij);
        int wynikOdejmowania = odejmowanie(22, 11);

  System.Console.WriteLine("Wynik odejmowania wynosi: {0}.",   

  wynikOdejmowania.ToString());
 
        Delegaty.MojDelegat mnozenie = new Delegaty.MojDelegat(d.Pomnoz);
        int wynikMnozenia = mnozenie(3, 8);
        System.Console.WriteLine("Wynik mnożenia wynosi: {0}.", wynikMnozenia.ToString());
 
        Delegaty.MojDelegat dzielenie = new Delegaty.MojDelegat(d.Podziel);
        int wynikDzielenia = dzielenie(64, 8);
        System.Console.WriteLine("Wynik dzielenia wynosi: {0}.", wynikDzielenia.ToString());
    }
}
W powyższym przykładzie zdefiniowaliśmy delegat o nazwie MojDelegat, który może zawierać dowolną metodę, która musi spełnić 2 warunki (de facto określone właśnie przez definicję delegata):


1 2 3 4 5 6 Dalej» 

Aktualna ocena to: 3,54

Oceń artykuł...
Porażka Kiepski Taki Sobie Dobry Super!

Tagi:  

A teraz:    Dodaj do ulubionych Dodaj do ulubionych    Wydrukuj Wydrukuj    Wyślij link znajomemu Wyślij link znajomemu    Skomentuj Skomentuj

Komentarze do 17. Delegaty i zdarzenia

Dodaj komentarz»

Adrian Dobrzycki 7 listopada 2007, 10:45

Jasno opisane. Jeżeli się potraktuje tą część kursu jako wstęp do delegatów i zdarzeń to jest 5+ (na 6). Brakuje tylko wywołań asynchronicznych...

adambart84 21 listopada 2007, 15:36

W świetle tego jak wyglądały relacje między premierem a prezydentem w rządzie, który właśnie ustąpił, przykład z początku tej części kursu nabiera nowego znaczenia:)

Gawson 6 grudnia 2007, 16:59

"Z punktu widzenia programisty delegat to typ referencyjny(...)" - poprawcie mnie jesli sie myle ale delegat nie jest typem referencyjnym i przekazywany jest jako parametr przez wartosc... chyba ze autorowi chodzilo o cos innego.

yaro27 15 listopada 2008, 14:46

Poprawiamy: delegat jest typem referencyjnym 
 
http://msdn.microsoft.com/pl-pl/netframework/cc511286.aspx

blacky 9 grudnia 2008, 0:20

Bardzo fajny artykul. Tylko strona 3, tu by sie przydal jakis ciekawy przyklad. Milo by bylo zobaczyc jakis dodatek, zalacznik pliku zrobiony na form-ie, z jakims przydatnym przykladem. Bardzo malo takich przydatnych rzeczy na polskich stronkach, wielkie dzieki i za to. Ja jeszcze polecam do tego : http://codeguru.pl/article-742.aspx, http://codeguru.pl/article-746.aspx.

krzysiek 11 lutego 2010, 10:30

No a co jak mam 2 różne klasy k1 i k2 i chcialbym zeby klasa k2 zostala poinformowana jesli w klasie k1 wystapi jakies zdarzenie??

huh 15 marca 2010, 12:38

podlaczam sie do pytania krzyska: czy musze w klasie k2 tworzyc obiekt k1 (lub odwrotnie) aby klasa  2 dowiedziala sie ze w klasie 1 wystapilo jakies zdarzenie ?

marcin 23 lutego 2011, 20:42

ja nie rozumiem o co chodzi z tymi delegatami ;/

marcin 23 lutego 2011, 20:44

a nie możemy użyć tego jednego delegata do wywołania tych wszystkich funkcji ?

maciek 7 marca 2011, 20:34

Czy Autor przy opracowywaniu tekstu czerpał z książki "Programowanie C#" wydawnictwa O"Reilly (wydawnictwo polskie: Helion) autorstwa Jesse Liberty? Przykład z prezydentem, a nawet kolejne fragmenty tekstu to jak żywo (po delikatnym "liftingu") fragmenty książki.

programuje_w_javie 25 maja 2011, 16:26

A ja nie wiem w ogóle po co to wymyślili ;D


Dodaj swój komentarz

»Zasady udzielania komentarzy

Autor:  
Komentarz:
Dodaj komentarz
© 2012 Onex Group
Onex Group O Onex Group  |  O CentrumXP.pl  |  Kontakt  |  Reklama
Nasze serwisy: CentrumXP.plXboxSpot.pl  |  Jama Mastaha