C # afgevaardigden tutorial en voorbeeld
C # gedelegeerden maakt het mogelijk een methode als een object. Dit betekent dat u in staat om de methode passeren als een argument om een andere methode zijn. Dit gebeurt door een gemachtigde wijst op een werkwijze en langs de gemachtigde als argument. Vervolgens met behulp van de gemachtigde u in staat om de methode die de gedelegeerde wijst om te bellen zijn.
Het bruikbare deel van gedelegeerden zo een werkwijze kan worden doorgegeven van het ene object naar het andere.
Zoals we weten een methode vertegenwoordigt een soort van actie die een object kan doen. Die actie wordt uitgevoerd in de methode definitie zelf binnen de klasse de methode wordt verklaard. Met een afgevaardigde van de implementatie van de methode of een deel van de methode opgenomen in de klas, kan worden gedelegeerd aan een andere klasse.
Hier, we hebben een eenvoudig voorbeeld aan de afgevaardigden begrijpen. We hebben een Playlist klasse die het mogelijk maakt om nummers toevoegen aan een afspeellijst. De Playlist klasse voorziet in een methode genaamd ShowPlaylist die print alles uit de nummers in de afspeellijst.
klasse playlist
{
// code eliminated for brevity
public void ShowPlaylist()
{
foreach (Lied in this.list)
{
Console.WriteLine("Song Title: {0}". song.Title);
}
}
}
Met behulp van de afspeellijst klasse ShowPlaylist methode zal de volledige playlist gedrukt krijgen.
Even voorstellen afgevaardigden naar de afspeellijst klasse. Met behulp van een afgevaardigde zal het de consument van de afspeellijst klasse aan de logica uit te voeren voor het tonen van de afspeellijst.
Hier verklaren wij een afgevaardigde in de afspeellijst klasse die een sing parameter van het type Song heeft
klasse playlist
{
// code geëlimineerd kortheidshalve
// delegate for showing song
public delegate bool ProcessPlaylistDelegate(Lied lied);
...
We moeten de ShowPlayList passen() Werkwijze voor het gebruiken ProcessPlaylistDelegate. De ShowPlayList werkwijze neemt de ProcessPlaylistDelegate als parameter. Nu kunnen we de afspeellijst te verwerken voordat u het afdrukt.
//show the playlist using another function attached to ProcessPlaylistDelegate
public void ShowPlaylist(ProcessPlaylistDelegate processPlaylist)
{
foreach (Lied in this.list)
{
als (processPlaylist(lied))
{
Console.WriteLine("Song Title: {0}", song.Title);
}
}
}
Nu kan deze klasse elke vorm van verwerking te delegeren aan een andere methode, zolang de return type en het type parameter overeenkomt met de afgevaardigde. Onder het programma klasse wordt met behulp van de Playlist klasse. Wij verklaren een nieuw Playlist.ProcessPlaylistDelegate en dan zijn we het bevestigen van de getMp3Songs aan de gemachtigde.
class Program
{
static void Main(draad[] args)
{
Playlist playlist1 = new Playlist();
//add some songs to the playlist
//use the delegate to process the list before it is printed on the screen
playlist1.ShowPlaylist(nieuwe Playlist.ProcessPlaylistDelegate(GetMp3Songs));
}
}
Hieronder vindt u de getMp3Songs methodedefinitie. Deze methode geeft alleen de mp3-songs. Daarom is de ShowPlaylist zal ony afdrukken van de mp3 songs.
public static bool GetMp3Songs(Lied lied)
{
//more logic goes here
return (song.Format == "mp3");
}
De kracht van de afgevaardigden er gebeurt als we de playlist kunnen verwerken anders zonder de Playlist klasse raken. Hieronder geven we verklaren 2 andere methoden die in het Programma klasse.
public static bool GetCdSongs(Lied lied)
{
//more logic goes here
return (song.Format == "CD");
}
public static bool GetAllSongs(Lied lied)
{
//more logic goes here
return true;
}
Nu hoeven we alleen maar om deze te hechten aan de afgevaardigden in de belangrijkste methode. Deze methoden zullen de afspeellijst een andere manier te verwerken. De eerste methode werkt alleen met een cd-nummers en de tweede methode zal alle nummers omvatten. Dit is slechts een eenvoudig voorbeeld, maar we kunnen zo veel verwerken als we nodig hebben toe te voegen zonder dat u de klasse Playlist raken.
playlist1.ShowPlaylist(nieuwe Playlist.ProcessPlaylistDelegate(GetCdSongs));
playlist1.ShowPlaylist(nieuwe Playlist.ProcessPlaylistDelegate(GetAllSongs));
