«Delegierter» Methoden Schablone Funktionszeiger Delegates «Delegierter» Methoden Schablone Funktionszeiger Dr. Beatrice Amrhein
Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 Überblick Definition eines Delegat Einfache Delegate Beispiele von Delegat-Anwendungen Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Definition
Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 Definition Ein Delegat ist ein Typ, der eine Referenz (Zeiger) auf eine Methode beschreibt. Delegate entsprechen den Funktionszeigern in C++, sie sind jedoch typsicher und geschützt. Delegate ermöglichen es, Methoden als Parameter zu übergeben. Delegate können miteinander verkettet werden (nacheinander ausgeführt). Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 Hinweis Delegate bilden die Grundlage für Ereignisse (wie z.B. für Benutzer-Eingaben). Durch das Verketten von Delegaten können mehrere Methoden an ein Ereignis angebunden werden. Alle miteinander verketteten Delegate werden gemeinsam (nacheinander) aufgerufen. Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 Deklaration Die Deklaration von einem Delegat sieht ähnlich aus wie eine Methodensignatur. Sie benötigt das Schlüsselwort delegate Sie hat einen Rückgabewert und eine beliebige Anzahl Parameter: <sichtbarkeit> delegate <Resultat-Typ> <Delegat-Name> (<Parameter-Liste>) Zwei Beispiele: public delegate void meinDelegat1(int n, string message); public delegate int meinDelegat2(object m, double d); Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Benutzen von Delegates Der Einsatz von Delegates erfolgt in drei Schritten. Deklaration des Delegate public delegate int meinDelegate( string s, int i ) Definieren des Delegate-Objekt mit der entsprechenden Methode meinDelegate delegateName = methode; Aufruf des Delegate-Objekts und dadurch indirekter Aufruf der Methode int resultat = delegateName("Eingabe", 17); Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 Erstes einfaches Beispiel: Verschiedene Ausgabe-Funktionen Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Ein C# Beispiel: Die Klasse Ausgabe Die Klasse Ausgabe hat zwei verschiedene Methoden zum Schreiben (auf die Konsole und in eine Datei) mit gleicher Signatur. using System; using System.IO; class Ausgabe { // Schreiben auf die Konsole public static void WriteToScreen(string s) { Console.WriteLine("Ausgabe: {0}", s); } //Schreiben in die Datei Test.txt const string fileName = "C:\\tmp\\Test.txt"; public static void WriteToFile(string s) { File.AppendAllText(fileName, s); } Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Ein C# Beispiel: Die Klasse Ausgabe // Deklaration des Delegaten mit gleicher Signatur // wie die beiden Methoden WriteToScreen und WriteToFile) public delegate void SchreibeDelegate(string s); Die static Bezeichnung wird weggelassen. Das Schlüsselwort delegate bezeichnet das Delegat. Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Ein C# Beispiel: Das Hauptprogramm public delegate void SchreibeDelegate(string s); //Benutze das Delegat static void Main(string[] args) { SchreibeDelegate psDelegate; string text = "Hier ist mein Text für dieses Beispiel"; //Zuweisen und ausführen der Methode «Schreibe auf den Schirm» psDelegate = WriteToScreen; psDelegate(text); // Zuweisen und ausführen der Methode «Schreibe ins File» psDelegate = WriteToFile; } Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 Zweites Beispiel Rechner Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Ein C# Beispiel: Die Klasse Rechner Die Klasse Rechner hat vier verschiedene Rechnungs-Methoden mit gleicher Signatur. class Rechner { public static double Addition(double x, double y) { return x + y; } public static double Subtraktion(double x, double y) { return x - y; } public static double Multiplikation(double x, double y) { return x * y; } public static double Division(double x, double y) { return x / y; } } Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Ein C# Beispiel: Das Hauptprogramm class Program { // Deklaration des Delegate gleiche Signatur wie die Methoden von Rechner public delegate double RechnungsOperation(double d1, double d2); static void Main(string[] args) // Initialisierung des Delegats RechnungsOperation berechne = Rechner.Addition; do // Einlesen der Operation Console.Write("Operation: +, -, * oder / "); char wahl = Console.ReadLine()[0]; Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Ein C# Beispiel: Das Hauptprogramm // Zuweisen der ausgewählten Operation der richtigen Methode switch (wahl) { case '+': berechne = Rechner.Addition; break; case '-': berechne = Rechner.Subtraktion; break; case '*': berechne = Rechner.Multiplikation; break; case '/': berechne = Rechner.Division; break; } Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Ein C# Beispiel: Das Hauptprogramm // Aufruf der Operation '+', '-', '*' oder '/' über das Delegat double resultat = berechne(input1, input2); // Ausgabe des Resultats Rechner.Ausgabe(wahl, x, y, resultat); Console.WriteLine("Beenden mit q, weiter mit w: "); } while (Console.ReadLine() != "q"); } Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 Verwenden von Delegaten als Parameter Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Ein C# Beispiel: Die Methode Ausgabe Wir wählen nochmals das ursprüngliche Delegat RechnungsOperation: public delegate double RechnungsOperation(double d1, double d2); Die Methode Ausgabe hat als vierten Parameter eine Rechnungs-Operation (also ein Delegat) public static void Ausgabe(double d1, double d2, char c, RechnungsOperation berechne) { . . . } Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Ein C# Beispiel: Die Methode Ausgabe Die so übergebene Funktion kann dann innerhalb der Methode verwendet werden: public static void Ausgabe(double d1, double d2, char c, RechnungsOperation berechne) { Console.WriteLine("{0} {1} {2} = {3}\n", d1, c, d2, berechne(d1, d2)); } Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Beispiel Geometrische Figuren
Wählen der Zeichenfunktion Das Geometrische Objekt, welches gezeichnet werden soll, soll durch Knopfdruck ausgewählt werden können.
Auswählen der Zeichen Funktion public delegate void ZeichnenDelegate(MainWindow window); public ZeichnenDelegate WaehleFigur(string s) { GeomFigur gf = new GeomFigur(); ZeichnenDelegate zeichne; switch (s) case "Rechteck": zeichne = gf.ZeichneRechteck; break; case "Kreis": zeichne = gf.ZeichneKreis; break; case "Ellipse": zeichne = gf.ZeichneEllipse; break; case "Dreieck": zeichne = gf.ZeichneDreieck; break; default: zeichne = gf.ZeichnePolygon;break; } return zeichne; Definition des Delegate WaehleFigur hat ein Delegate als Rückgabewert. Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Zeichenfunktionen müssen delegate Definiton «erfüllen» public class GeomFigur { public void ZeichneRechteck(MainWindow window) Rechteck r = new Rechteck(s1); r.Zeichne(window); } public void ZeichneEllipse(MainWindow window) Ellipse r = new Ellipse(s1); . . . public delegate void ZeichnenDelegate(MainWindow window); Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Verwenden des Delegate public delegate void ZeichnenDelegate(MainWindow window); public void Main(MainWindow window, string s) { ZeichnenDelegate zeichne = WaehleFigur(s); zeichne(window); } public ZeichnenDelegate WaehleFigur(string s) GeomFigur gf = new GeomFigur(); ZeichnenDelegate zeichne; switch (s) case "Rechteck": zeichne = gf.ZeichneRechteck; break; case "Kreis": zeichne = gf.ZeichneKreis; break; . . . . return zeichne; Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012