前回の続きです。
delegateができること
複数のメソッドを持つ
今までデリゲートには「=」演算子でメソッドを代入してきたが、
「+=」演算子で複数のメソッドを代入することが出来る。
この状態のデリゲートを「マルチキャストデリゲート」と呼ぶらしい。
例えば、次のようなコードを書くと
public class DelegateSample03 { //SampleDelegate型の定義 delegate void SampleDelegate(string str); //SampleDelegate型のsample変数の宣言 static SampleDelegate sample; public static void Main(){ var text = "出力して欲しい物"; //SampleDelegate型のsample変数にstatic void Write(string)メソッドの代入 sample = Write; //さらにsample変数にstatic void DoubleWrite(string)メソッドの追加代入 sample += DoubleWrite; //sample変数に代入されたメソッドを参照呼出し sample(text); } public static void Write(string text){ System.Console.WriteLine(text); } public static void DoubleWrite(string text){ System.Console.WriteLine(text + text); } }
出力:
出力して欲しい物 出力して欲しい物出力して欲しい物
となる。
しつこいようだが、このコード自体に意味はない。
DelegateSample03.csの12行目で「+=」演算子を用いてstatic void DoubleWrite(string)メソッドを代入することで、出力の2行目に「出力して欲しい物出力して欲しい物」が出力されている。
マルチキャストデリゲートでメソッドを呼び出す時、
メソッドの処理は並列に行われるわけではなく、代入した順に順番に実行される。
また、マルチキャストデリゲートに「-=」演算子を用いることで代入したメソッドを削除することもできる。
例えば先ほどのDelegateSample03.csに用いてみると、
public class DelegateSample03plus { //SampleDelegate型の定義 delegate void SampleDelegate(string str); //SampleDelegate型のsample変数の宣言 static SampleDelegate sample; public static void Main(){ var text = "出力して欲しい物"; //SampleDelegate型のsample変数にstatic void Write(string)メソッドの代入 sample = Write; //さらにsample変数にstatic void DoubleWrite(string)メソッドの追加代入 sample += DoubleWrite; //static Write(string)メソッドを削除 sample -= Write; //sample変数に代入されたメソッドを参照呼出し sample(text); } public static void Write(string text){ System.Console.WriteLine(text); } public static void DoubleWrite(string text){ System.Console.WriteLine(text + text); } }
出力:
出力して欲しい物出力して欲しい物
となる。
DelegateSample03plus.csの14行目を追加することで、先ほどは呼び出されていたstatic void Write(string)メソッドが呼び出されないことがわかる。