C# deleguje návod a príklad

C# delegáti umožňujú použiť metódu ako objekt. To znamená, že metódu môžete odovzdať ako argument inej metóde. To sa robí tak, že nasmerujete delegáta na metódu a odošlete delegáta ako argument. Potom pomocou delegáta môžete zavolať metódu, na ktorú delegát ukazuje.

Užitočnou súčasťou delegátov je, že metóda môže byť odovzdaná z jedného objektu do druhého.

Ako vieme, metóda predstavuje nejaký typ akcie, ktorú môže objekt vykonať. Táto akcia je implementovaná v samotnej definícii metódy v rámci triedy, v ktorej je metóda deklarovaná. S delegátom implementácia metódy alebo časti metódy obsiahnutej v triede, možno delegovať do inej triedy.

Tu, máme jednoduchý príklad na pochopenie delegátov. We have a Playlist class that allows to add songs to a playlist. The Playlist class provides a method called ShowPlaylist that prints out all the songs in the playlist.

class Playlist
{
     // code eliminated for brevity
     
    public void ShowPlaylist()
    {
          foreach (Song song in this.list)
          {
               Console.WriteLine("Song Title: {0}". song.Title);       
          }
    }

}

Using the Playlist class ShowPlaylist method will get the full playlist printed.

Let’s introduce delegates to the Playlist class. Using a delegate will allow the the consumer of the Playlist class to implement the logic for showing the playlist.

Here we declare a delegate in the Playlist class which has a sing parameter of type Song

class Playlist
{
     // code eliminated for brevity
     // delegate for showing song
     public delegate bool ProcessPlaylistDelegate(Song song);

...

Musíme upraviť ShowPlayList() metóda na použitie ProcessPlaylistDelegate. Metóda ShowPlayList berie ako parameter ProcessPlaylistDelegate. Teraz môžeme zoznam skladieb pred tlačou spracovať.

        //show the playlist using another function attached to ProcessPlaylistDelegate
        public void ShowPlaylist(ProcessPlaylistDelegujte procesPlaylist)
        {
            foreach (Song song in this.list)
            {
                ak (spracovať Zoznam skladieb(pieseň))
                {
                    Console.WriteLine("Song Title: {0}", song.Title);
                }
            }
        }

Teraz môže táto trieda delegovať akékoľvek spracovanie na inú metódu, pokiaľ sa typ návratu a typ parametra zhodujú s delegátom. Pod triedou Program sa používa trieda Playlist. Vyhlasujeme nový Playlist.ProcessPlaylistDelegate a potom k delegátovi pripojíme súbor getMp3Songs.

    triedny program
    {
        static void Main(reťazec[] args)
        {
             Zoznam skladieb playlist1 = nový zoznam skladieb();

             //add some songs to the playlist

             //use the delegate to process the list before it is printed on the screen
             playlist1.ShowPlaylist(nový Playlist.ProcessPlaylistDelegate(GetMp3Songs));
        }

  }

Nižšie je uvedená definícia metódy getMp3Songs. Táto metóda vráti iba skladby mp3. Preto ShowPlaylist vytlačí iba mp3 skladby.

        verejné statické bool GetMp3Songs(Song song)
        {
            //more logic goes here
            return (pieseň.Formát == "mp3");
        }

Sila delegátov nastáva vtedy, keď môžeme zoznam skladieb spracovať inak bez toho, aby sme sa museli dotknúť triedy Zoznam skladieb. Nižšie vyhlasujeme 2 iné metódy v triede Program.

verejné statické bool GetCdSongs(Song song)
 {
 //more logic goes here
 return (pieseň.Formát == "CD");
 }

verejné statické bool GetAllSongs(Song song)
 {
 //more logic goes here
 return true;
 }

Teraz ich len musíme pripojiť k delegátom v hlavnej metóde. Tieto metódy spracujú zoznam skladieb odlišne. Prvá metóda bude zahŕňať iba skladby z CD a druhá metóda bude zahŕňať všetky skladby. Toto je len jednoduchý príklad, ale môžeme pridať toľko spracovania, koľko požadujeme, bez toho, aby sme sa museli dotknúť zoznamu skladieb triedy.

            zoznam skladieb1.Zobraziť zoznam skladieb(nový Playlist.ProcessPlaylistDelegate(GetCdSongs));

            zoznam skladieb1.Zobraziť zoznam skladieb(nový Playlist.ProcessPlaylistDelegate(GetAllSongs));


Na stiahnutie