マルチキャストデリゲート
「デリゲートの基本」ではデリゲート f1 はひとつのメソッドを参照していました。
しかし、デリゲートは複数の呼び出しをサポートしています。これを マルチキャストデリゲート (multicast delegate) といいます。
デザインパターンにおけるいわゆる Publisher-Subscriber パターンでは一般に複数の購読者をサポートすることが要求されますが、 マルチキャストデリゲートによって、ちゃんと複数の Subscriber をサポートできることになります。
まずテストのために使う Class1 は以前と同じ次の通りです。
using System;
namespace DelegateTest1
{
class Class1
{
public delegate void f1Delegate();
public f1Delegate f1;
public void Test()
{
if (f1 != null)
{
f1();
}
}
}
}
マルチキャストデリゲートのためには、次のように複数のデリゲートを設定します。
using System;
namespace DelegateTest1
{
class Program
{
static void Main(string[] args)
{
Class1 c1 = new Class1(); c1.f1 = new Class1.f1Delegate(a);
c1.f1 += new Class1.f1Delegate(b); c1.Test();
}
static void a()
{
Console.WriteLine("I'm a().");
}
static void b()
{
Console.WriteLine("I'm b().");
}
}
}
ここでデリゲートの呼び出しリスト (invocation list) にメソッド b を追加するときに、+= を利用していることに注意してください。 += とすることによって、呼び出しリストに b が「追加」されます。
ここで = とすると、呼び出しリストは初期化され、b だけになるため、メソッド a は呼び出されません。
実行結果は次の通り
I'm a(). I'm b().
+= は Combine を呼んでいる
+= でインボケーションリストにデリゲートを追加しました。これは次のコードと同様です。
using System;
namespace DelegateTest1
{
class Program
{
static void Main(string[] args)
{
Class1 c1 = new Class1();
c1.f1 = new Class1.f1Delegate(a); c1.f1 = (Class1.f1Delegate)
Delegate.Combine(
c1.f1,
new Class1.f1Delegate(b)); c1.Test();
}
static void a()
{
Console.WriteLine("I'm a().");
}
static void b()
{
Console.WriteLine("I'm b().");
}
}
}
System.Delegate の Combine メソッドを利用すると、特定のデリゲートのインボケーションリストにデリゲートを追加できます。 += と表記することで裏では Combine メソッドを呼んでいます。