C # delegati udžbenik i primjer
C# delegati omogućuju korištenje metode poput objekta. To znači da možete proslijediti metodu kao argument nekoj drugoj metodi. To se radi usmjeravanjem delegata na metodu i prosljeđivanjem delegata kao argumenta. Zatim pomoću delegata možete pozvati metodu na koju delegat pokazuje.
Korisni dio delegata je da se metoda može prenijeti s jednog objekta na drugi.
Kao što znamo, metoda predstavlja neku vrstu akcije koju objekt može učiniti. Ta je radnja implementirana u samoj definiciji metode unutar klase u kojoj je metoda deklarirana. S delegatom implementacija metode ili dijela metode sadržane u klasi, može se delegirati u drugu klasu.
Ovdje, imamo jednostavan primjer za razumijevanje delegata. Imamo klasu Playlist koja omogućuje dodavanje pjesama na playlistu. Klasa Playlist pruža metodu pod nazivom ShowPlaylist koja ispisuje sve pjesme na popisu za reprodukciju.
razred Playlist
{
// code eliminated for brevity
public void ShowPlaylist()
{
za svakoga (Pjesma na ovom popisu)
{
Konzola.WriteLine("Naslov pjesme: {0}". Naslov pjesme);
}
}
}
Korištenje metode ShowPlaylist klase Playlist ispisat će cijeli popis pjesama.
Predstavimo delegate u klasi Playlist. Korištenje delegata omogućit će korisniku klase Playlist da implementira logiku za prikazivanje playliste.
Ovdje deklariramo delegata u klasi Playlist koja ima sing parametar tipa Song
razred Playlist
{
// kod eliminiran zbog kratkoće
// delegate for showing song
public delegate bool ProcessPlaylistDelegate(Pjesma pjesma);
...
Moramo prilagoditi ShowPlayList() metoda za korištenje ProcessPlaylistDelegate. Metoda ShowPlayList uzima ProcessPlaylistDelegate kao parametar. Sada možemo obraditi Playlist prije ispisa.
//show the playlist using another function attached to ProcessPlaylistDelegate
public void ShowPlaylist(ProcessPlaylistDelegirati procesPlaylist)
{
za svakoga (Pjesma na ovom popisu)
{
ako (obraditi popis za reprodukciju(pjesma))
{
Konzola.WriteLine("Naslov pjesme: {0}", Naslov pjesme);
}
}
}
Sada ova klasa može delegirati bilo koju obradu drugoj metodi sve dok tip povrata i tip parametra odgovaraju delegatu. Ispod klase Program koristi se klasa Playlist. Deklariramo novi Playlist.ProcessPlaylistDelegate i zatim prilažemo getMp3Songs delegatu.
razreda Program
{
statička praznina Glavni(niz[] args)
{
Playlist playlist1 = novi Playlist();
//add some songs to the playlist
//use the delegate to process the list before it is printed on the screen
playlist1.ShowPlaylist(novi popis za reprodukciju.ProcessPlaylistDelegate(GetMp3Songs));
}
}
Ispod je definicija metode getMp3Songs. Ova metoda vraća samo mp3 pjesme. Stoga će ShowPlaylist ispisati samo mp3 pjesme.
javni statički bool GetMp3Songs(Pjesma pjesma)
{
//more logic goes here
return (pjesma.Format == "mp3");
}
Moć delegata se događa kada možemo drugačije obraditi popis za reprodukciju bez potrebe da dodirujemo klasu Popis za reprodukciju. U nastavku izjavljujemo 2 druge metode u klasi Program.
javni statički bool GetCdSongs(Pjesma pjesma)
{
//more logic goes here
return (pjesma.Format == "CD");
}
javni statički bool GetAllSongs(Pjesma pjesma)
{
//more logic goes here
return true;
}
Sada ih samo trebamo priložiti delegatima u glavnoj metodi. Ove će metode različito obraditi popis za reprodukciju. Prva metoda će uključivati samo CD pjesme, a druga metoda će uključivati sve pjesme. Ovo je samo jednostavan primjer, ali možemo dodati onoliko obrade koliko nam je potrebno, a da ne moramo dodirivati klasu Playlist.
playlist1.ShowPlaylist(novi popis za reprodukciju.ProcessPlaylistDelegate(GetCdSongs));
playlist1.ShowPlaylist(novi popis za reprodukciju.ProcessPlaylistDelegate(GetAllSongs));
