At times it is desirable to multicast, or call two implementing methods through a single delegate. You accomplish multicasting by encapsulating the various methods in delegates. Then you combine the delegates using the Delegate.Combine( ) shared method. The Combine( ) method takes an array of delegates as a parameter and returns a new delegate that represents the combination of all the delegates in the array.
To see how this works, create a simplistic class that declares a delegate:
Public Class MyClassWithDelegate ' the delegate declaration Public Delegate Sub StringDelegate(ByVal s As String) End Class
Then create a class (MyImplementingClass) that implements a number of methods that match the StringDelegate:
Public Class MyImplementingClass Public Shared Sub WriteString(ByVal s As String) Console.WriteLine("Writing string {0}", s) End Sub Public Shared Sub LogString(ByVal s As String) Console.WriteLine("Logging string {0}", s) End Sub Public Shared Sub TransmitString(ByVal s As String) Console.WriteLine("Transmitting string {0}", s) End Sub End Class
Within the Run( ) method of your Tester class, you'll instantiate three StringDelegate objects (Writer, Logger, Transmitter):
Dim Writer, Logger, Transmitter As MyClassWithDelegate.StringDelegate
You instantiate these delegates by passing in the address of the methods you wish to encapsulate:
Writer = New MyClassWithDelegate.StringDelegate( _ AddressOf MyImplementingClass.WriteString) Logger = New MyClassWithDelegate.StringDelegate( _ AddressOf MyImplementingClass.LogString) Transmitter = New MyClassWithDelegate.StringDelegate( _ AddressOf MyImplementingClass.TransmitString)
You next instantiate a multicast delegate (myMulticastDelegate) that you'll use to combine the three other delegates:
Dim myMulticastDelegate As MyClassWithDelegate.StringDelegate
Next you create an array of the first two delegates:
Dim arr( ) As MyClassWithDelegate.StringDelegate = {Writer, Logger}
and use that array to instantiate the multicast delegate:
myMulticastDelegate = _ DirectCast(System.Delegate.Combine(arr), _ MyClassWithDelegate.StringDelegate)
DirectCast is used to cast the result of calling Combine( ) to the specialized type MyClassWithDelegate.StringDelegate, because Combine returns an object of the more general type Delegate.
Then you can add the third delegate to the collection by calling the overloaded Combine( ) method, this time passing in the existing multicast delegate and the new delegate to add:
myMulticastDelegate = _ DirectCast(System.Delegate.Combine(myMulticastDelegate, Transmitter), _ MyClassWithDelegate.StringDelegate)
You can remove just the Logger delegate by calling the static method Remove( ), passing in the multicast delegate and the delegate you wish to remove. The return value is a Delegate, which you cast to a StringDelegate and assign back to the multicast delegate:
myMulticastDelegate = _ DirectCast(System.Delegate.Remove(myMulticastDelegate, Logger), _ MyClassWithDelegate.StringDelegate)
Example 12-3 shows the complete code for this listing.
Option Strict On Imports System Namespace Multicasting Public Class MyClassWithDelegate ' the delegate declaration Public Delegate Sub StringDelegate(ByVal s As String) End Class Public Class MyImplementingClass Public Shared Sub WriteString(ByVal s As String) Console.WriteLine("Writing string {0}", s) End Sub Public Shared Sub LogString(ByVal s As String) Console.WriteLine("Logging string {0}", s) End Sub Public Shared Sub TransmitString(ByVal s As String) Console.WriteLine("Transmitting string {0}", s) End Sub End Class Class Tester Public Sub Run( ) ' define three StringDelegate objects Dim Writer, Logger, Transmitter As _ MyClassWithDelegate.StringDelegate ' define another StringDelegate ' to act as the multicast delegate Dim myMulticastDelegate As MyClassWithDelegate.StringDelegate ' Instantiate the first three delegates, ' passing in methods to encapsulate Writer = New MyClassWithDelegate.StringDelegate( _ AddressOf MyImplementingClass.WriteString) Logger = New MyClassWithDelegate.StringDelegate( _ AddressOf MyImplementingClass.LogString) Transmitter = New MyClassWithDelegate.StringDelegate( _ AddressOf MyImplementingClass.TransmitString) ' Define array of StringDelegates Dim arr( ) As MyClassWithDelegate.StringDelegate = _ {Writer, Logger} ' Invoke the Writer delegate method ' vbCrLf is the VB equivalent of Environment.NewLine Writer("String passed to Writer" & vbCrLf) ' Invoke the Logger delegate method Logger("String passed to Logger" & vbCrLf) ' Invoke the Transmitter delegate method Transmitter("String passed to Transmitter" & vbCrLf) ' Tell the user you are about to combine ' two delegates into the multicast delegate Console.WriteLine(vbCrLf & "myMulticastDelegate = " + _ "Writer and Logger") ' combine the two delegates, the result is ' assigned to myMulticast Delegate myMulticastDelegate = _ DirectCast(System.Delegate.Combine(arr), _ MyClassWithDelegate.StringDelegate) ' Call the delegated methods, two methods ' will be invoked myMulticastDelegate("First string passed to Collector") ' Tell the user you are about to add ' a third delegate to the multicast Console.WriteLine(vbCrLf & _ "myMulticastDelegate Adds Transmitter") ' add the third delegate myMulticastDelegate = _ DirectCast(System.Delegate.Combine(myMulticastDelegate, _ Transmitter), _ MyClassWithDelegate.StringDelegate) ' invoke the three delegated methods myMulticastDelegate("Second string passed to Collector") ' tell the user you are about to remove ' the logger delegate Console.WriteLine(vbCrLf & "myMulticastDelegate -= Logger") ' remove the logger delegate myMulticastDelegate = _ DirectCast(System.Delegate.Remove(myMulticastDelegate, _ Logger), MyClassWithDelegate.StringDelegate) ' invoke the two remaining ' delegated methods myMulticastDelegate("Third string passed to Collector") End Sub Public Shared Sub Main( ) Dim t As New Tester( ) t.Run( ) End Sub End Class End Namespace ' Multicasting Output: Writing string String passed to Writer Logging string String passed to Logger Transmitting string String passed to Transmitter myMulticastDelegate = Writer and Logger Writing string First string passed to Collector Logging string First string passed to Collector myMulticastDelegate Adds Transmitter Writing string Second string passed to Collector Logging string Second string passed to Collector Transmitting string Second string passed to Collector myMulticastDelegate -= Logger Writing string Third string passed to Collector Transmitting string Third string passed to Collector
Top |