Delegates sind ein sehr wichtiges Konzept im .NET-Framework, zu dem es in VB 6.0 kein direktes Pendant gibt.
Ein Delegate ist vergleichbar mit einem objekt-orientierten Funktionszeiger, nur dass er typsicher ist, da er außer der Funktionsadresse auch das Wissen über die Datentypen der aufzurufenden Funktion mit sich trägt.
Ein Delegate-Objekt fasst also eine bestimmte Funktionsadresse mit einer dazugehörigen Signatur zusammen, übergibt das Ganze an eine andere Klasse oder einen anderen x-beliebigen Ort und stellt so sicher, dass die Funktion nur mit der richtigen Signatur aufgerufen werden kann.
Die Verwendung eines Delegate erfolgt in drei Schritten:
1. Definition des Delegate
Delegate Sub DelegateNr1(ByVal sString As String) |
Dabei entsteht zunächst eine Klasse, die instanziiert werden muss.
2. Deklaration und Instanziierung eines Objektes vom Typ der Delegate-Definition
Dim TypeD As New DelegateNr1(AddressOf Console.WriteLine) |
Dabei wird die Adresse der aufzurufenden Methode über den AddressOf-Operator übergeben.
3. Aufrufen der Methode
TypeD("Dieser String wird geschrieben.") |
Dabei muss die Methode die gleiche Anzahl Parameter, gleiche ParameterTypen (inklusive ReturnTyp) und gleiche Parameterarten haben.
Ein Multicast-Delegate ist ein Delegate, in dem über die Combine-Methode mehrere Delegates, die aber kompatibel bezüglich ihrer Signatur sein müssen, zusammengefasst werden. Somit lassen sich über einen einzigen Aufruf mehrere Funktionen aufrufen.
Das Interessanteste ist aber, dass der gesamte Ereignismechanismus in .NET auf Delegates basieren. Sie sind das Bindeglied zwischen Ereignissender und Ereignisempfänger, wobei sie aber nicht direkt in Erscheinung treten.
Der Befehl
AddHandler myButton.Click, AddressOf MyButton_Click |
ist eigentlich die Kurzversion für
AddHandler myButton.Click, New EventHandler(AddressOf MyButton_Click) |
wobei EventHandler der Name des implizit deklarierten Delegate ist.
Bei einem Multicast-Delegate wird der Event über AddHandler mit einer beliebigen Anzahl an Prozeduren verknüpft.
Über den RemoveHandler-Befehl kann die Verknüpfung jederzeit wieder aufgehoben werden.