W tej lekcji poznasz co to są delegaty i do czego one służą. Najważniejsze na samym początku jest wyobrażenie sobie czym jest delegata, najprościej tłumacząc delegata to tak jakby obiekty który przechowuje referencje do metody, czyli podczas wywoływania tego obiektu delegaty wywołamy metodę której referencja była przechowywana. Aby móc przypisać metodę do delegaty musi ona spełniać pewien warunek, tym warunkiem jest zgodność deklaracji metody i delegaty, ale o tym powiemy za chwilę. Najpierw tradycyjnie zacznijmy od ogólnej deklaracji delegaty:
delegate typ_zwracany nazwa_delegaty(parametry) ;
Delegate deklarujemy zawsze po deklaracjach przestrzeni nazw, nie jest ona składnikiem klas. Wspominałem wcześniej że podczas przypisywania metody do delegaty musi być spełniony pewien warunek tym warunkiem jest to że metoda musi posiadać ten sam typ zwracany oraz musi pobierać te same parametry. Ok. Przejdźmy zatem do bardzo prostego przykładu w którym to utworzymy sobie obiekt takiej delegaty:
Początek kodu:
using System;
delegate void delegata(int liczba);
class Klasa_a
{
public int a;
public Klasa_a(int a)
{
this.a = a;
}
public void metoda(int cyferka)
{
Console.WriteLine(cyferka * a);
}
}
class Klasa_b
{
public static void Liczba(int c)
{
Console.WriteLine(c);
}
}
class Pokaz
{
public static void Main()
{
Klasa_a A = new Klasa_a(4);
delegata d1 = new delegata(A.metoda);
delegata d2 = new delegata(Klasa_b.Liczba);
d1(3);
d2(7);
}
}
Koniec kodu:
Przechodzimy zatem do interpretacji kodu, jak widzisz referencje do metody przesyłamy jakby parametr konstruktora delegaty, jednak nie piszemy nawiasów i w tym momencie nie przesyłamy parametru. Parametr przesyłamy dopiero podczas wywołania delegaty, jako małe ćwiczenie weź stwórz delegate która zwraca jakąś wartość.
Tak naprawdę sednem wykorzystanie delegat są łańcuchy wywołań, dzięki którym możemy wywołać kilka delegat pod rząd kiedy tylko będziemy chcieli. Utworzymy zetem prosty łańcuch wywołań, jednak musisz pamiętać o tym że delegaty dla łańcuchu wywołań nie mogą zwracać wartości czyli musi być void, oczywiście parametr pobierać mogą. A oto krótki przykład:
Początek kodu:
using System;
delegate void Czynnosc();
class Kuchnia
{
public void Mycie_rak()
{
Console.WriteLine(„Myje ręce”);
}
public void Gotuje()
{
Console.WriteLine(„Gotuje”);
}
}
class Sypialnia
{
public static void Spie()
{
Console.WriteLine(„Śpię”);
}
}
class Pokaz
{
public static void Main()
{
Kuchnia A = new Kuchnia();
Czynnosc mycie_rak = new Czynnosc(A.Mycie_rak);
Czynnosc gotowanie = new Czynnosc(A.Gotuje);
Czynnosc spanie = new Czynnosc(Sypialnia.Spie);
Czynnosc lancuch;
lancuch = mycie_rak;
lancuch += gotowanie;
lancuch += spanie;
lancuch();
}
}
Koniec kodu:
Aby utworzyć łańcuch wywołań należy najpierw dla każdej metody utworzyć delegate, następnie należy utworzyć jedną delegate do której to przypisujemy referencję pierwszego wywołania potem za pomocą złożonych operatorów przypisania dodajemy kolejne. Aby odjąć jakąś metodę stosujemy po prostu minus czyli -= (złożony operator przypisania). To mniej więcej na tyle. Delegacje są bardzo ważne gdy będziemy się uczyć o zdarzeniach, ważne abyś sobie przyswoił dość porządnie ten materiał
.