Wo verwende ich Delegierte? [geschlossen]

108

Was sind einige Orte in der realen Welt, an denen Delegierte gefragt sind? Ich bin gespannt, in welchen Situationen oder Mustern diese Methode die beste Lösung ist. Kein Code erforderlich.

Slipsec
quelle

Antworten:

33

Ein Delegat ist ein benannter Typ, der eine bestimmte Art von Methode definiert. So wie eine Klassendefinition alle Mitglieder für die angegebene Art von Objekt festlegt, legt der Delegat die Methodensignatur für die Art der von ihm definierten Methode fest.

Basierend auf dieser Anweisung ist ein Delegat ein Funktionszeiger und definiert, wie diese Funktion aussieht.

Ein gutes Beispiel für eine reale Anwendung eines Delegaten ist das Prädikat . Im Beispiel des Links werden Sie feststellen, dass Array.Find das Array zur Suche und dann ein Prädikat verwendet, um die Kriterien für die Suche zu behandeln. In diesem Fall wird eine Methode ProductGT10 übergeben, die mit der Prädikatsignatur übereinstimmt.

Dale Ragan
quelle
154

Wie in "Lernen von C # 3.0: Beherrschen der Grundlagen von C # 3.0" angegeben

Allgemeines Szenario: Wenn ein Staatsoberhaupt stirbt, hat der Präsident der Vereinigten Staaten normalerweise keine Zeit, persönlich an der Beerdigung teilzunehmen. Stattdessen entsendet er einen Delegierten. Oft ist dieser Delegierte der Vizepräsident, aber manchmal ist der Vizepräsident nicht verfügbar und der Präsident muss eine andere Person entsenden, beispielsweise den Außenminister oder sogar die First Lady. Er möchte seine delegierte Autorität nicht an eine einzelne Person „fest verdrahten“. Er könnte diese Verantwortung an jeden delegieren, der in der Lage ist, das richtige internationale Protokoll auszuführen.

Der Präsident legt im Voraus fest, welche Verantwortung delegiert wird (Teilnahme an der Beerdigung), welche Parameter übergeben werden (Beileid, freundliche Worte) und welchen Wert er zurückerhalten möchte (guter Wille). Anschließend weist er dieser delegierten Verantwortung zur „Laufzeit“ im Verlauf seiner Präsidentschaft eine bestimmte Person zu.

In der Programmierung Szenario: Sie sind häufig mit Situationen konfrontiert, in denen Sie eine bestimmte Aktion ausführen müssen, aber nicht im Voraus wissen, welche Methode oder sogar welches Objekt Sie zur Ausführung aufrufen möchten.

Zum Beispiel: Eine Schaltfläche weiß möglicherweise nicht, welches Objekt oder welche Objekte benachrichtigt werden müssen. Anstatt die Schaltfläche mit einem bestimmten Objekt zu verbinden, verbinden Sie die Schaltfläche mit einem Delegaten und lösen diesen Delegaten dann bei der Ausführung des Programms in eine bestimmte Methode auf.

Atish Dipongkor - MVP
quelle
1
Warum nicht einfach anonyme Funktionen / Lambdas verwenden?
Pacerier
5
@Pacerier Dies ist eine späte Antwort, und Sie haben die Antwort möglicherweise entdeckt, aber für andere Leser, die dies finden: Eine anonyme Funktion ist eine Art Delegierter.
Anthony
10
@ Anthony + Pacerier: Eine anoymöse Methode ist KEIN Delegierter. Eine anonyme Methode ist ein Teil des Codes. Ein Delegat ist ein Zeiger, der auf diesen Code verweist. Sie können keine anoymöse Methode haben, ohne dass ein Delegat darauf zeigt, sonst würde sie niemals aufgerufen. Ein Lambda ist ein Operator, mit dem Lambda-Ausdrücke erstellt werden. Lambda-Ausdrücke führen meist zu anoymösen Methoden, auf die ... ein Delegierter hinweisen wird.
Martin Mulder
Blöd mich, aber ich würde nur eine If ElseIf-Anweisung erstellen, wenn ich die Verwendung beim Drücken der Taste nicht wüsste. Ich sagte dumm mich.
JustJohn
@Pacerier anonyme Methode in C # 2.0 eingeführt und Lambda in C # 3.0 eingeführt Wenn Lambda zuerst eingeführt würde, hätte es nie anonyme Methoden gegeben und sogar delegiert!
AminM
18

Eine häufige Verwendung von Delegaten für generische Listen besteht darin, über Aktionsdelegierte (oder deren anonymes Äquivalent) eine einzeilige foreach-Operation zu erstellen:

myList.Foreach( i => i.DoSomething());

Ich finde den Prädikat-Delegaten auch sehr nützlich beim Suchen oder Bereinigen einer Liste:

myList.FindAll( i => i.Name == "Bob");    
myList.RemoveAll( i => i.Name == "Bob");

Ich weiß, dass Sie gesagt haben, dass kein Code erforderlich ist, aber ich finde es einfacher, seine Nützlichkeit über Code auszudrücken. :) :)

Jon Limjap
quelle
13

Das Binden von Ereignissen an Ereignishandler ist normalerweise Ihre erste Einführung in Delegaten ... Sie wissen möglicherweise nicht einmal, dass Sie sie verwendet haben, da der Delegat in der EventHandler-Klasse eingeschlossen ist.

FlySwat
quelle
5

Wenn Sie wissen möchten, wie das Delegate-Muster in realem Code verwendet wird, sind Sie unter Mac OS X genau richtig. Cocoa ist Apples bevorzugtes UI-Toolkit für die Programmierung unter Mac OS X und in Objective C codiert Entwickelt, sodass jede UI-Komponente eher durch Delegierung als durch Unterklassen oder andere Mittel erweitert werden soll.

Für weitere Informationen empfehle ich, hier zu lesen, was Apple über Delegierte zu sagen hat .

Flut
quelle
5

Ich hatte ein Projekt, das Win32 Python verwendete.

Aus verschiedenen Gründen verwendeten einige Module odbc.py, um auf die Datenbank zuzugreifen, und andere Module - pyodbc.py.

Es gab ein Problem, wenn eine Funktion von beiden Modultypen verwendet werden musste. Es wurde ein Verbindungsobjekt als Argument übergeben, aber dann musste es wissen, ob dbi.dbiDate oder datetime zur Darstellung von Zeiten verwendet werden sollte.

Dies lag daran, dass odbc.py als Werte in SQL-Anweisungen das Datum dbi.dbiDate erwartet, während pyodbc.py Datetime-Werte erwartet.

Eine weitere Komplikation bestand darin, dass mit den von odbc.py und pyodbc.py erstellten Verbindungsobjekten keine zusätzlichen Felder festgelegt werden konnten.

Meine Lösung bestand darin, die von odbc.odbc (...) und pyodbc.pyodbc (...) zurückgegebenen Verbindungsobjekte von einer Delegatenklasse zu verpacken, die die gewünschte Zeitrepräsentationsfunktion als Wert eines zusätzlichen Felds enthält und die delegiert Alle anderen Feldanforderungen an das ursprüngliche Verbindungsobjekt.

Omer Zak
quelle
5

Ich hatte die gleiche Frage wie Sie und ging auf diese Seite, um eine Antwort zu erhalten.

Anscheinend habe ich es nicht besser verstanden, obwohl ich die Beispiele in diesem Thread durchgesehen habe.

Nachdem ich Folgendes gelesen hatte, fand ich eine großartige Verwendung für Delegierte: http://www.c-sharpcorner.com/UploadFile/thiagu304/passdata05172006234318PM/passdata.aspx

Dies scheint für neue Benutzer offensichtlicher zu sein, da die Übergabe von Werten in Forms viel komplizierter ist als bei ASP.NET-Websites mit POST / GET (QueryString).

Grundsätzlich definieren Sie einen Delegaten, der "TextBox- Text " als Parameter verwendet.

// Form 1

// Class Property Definition
public delegate void delPassData(TextBox text);


// Click Handler
private void btnSend_Click(object sender, System.EventArgs e)
{
     Form2 frm= new Form2();
     delPassData del=new delPassData(frm.funData);
     del(this.textBox1);
     frm.Show();
}

// ZUSAMMENFASSUNG: Delegat definieren, neue Form2-Klasse instanziieren, dem Delegat die Funktion funData () zuweisen, Ihre Textbox an den Delegaten übergeben. Zeigen Sie das Formular.

// Form2

public void passData(TextBox txtForm1)
{

     label1.Text = txtForm1.Text;
}

// ZUSAMMENFASSUNG: Nehmen Sie einfach TextBox txtForm1 als Parameter (wie in Ihrem Delegaten definiert) und weisen Sie dem Text von textBox Beschriftungstext zu.

Ich hoffe, dass dies die Verwendung für Delegierte erleichtert :) ..

dezza
quelle
Entweder muss die Form2-Klassenmethode funData (anstelle von passData) oder die Form1-Funktionszuweisung frm.passData (anstelle von frm.funData) heißen.
Ethan
1

Eine schnelle Google-Suche ergab dieses http://en.wikipedia.org/wiki/Delegation_pattern . Grundsätzlich delegieren Sie jedes Mal, wenn Sie ein Objekt verwenden, das seine Aufrufe an ein anderes Objekt weiterleitet.

Martinatime
quelle