デリゲートとは?
メソッドを呼び出す手法の一つで、メソッドを直接呼び出すのではなく、誰かに依頼をしてメソッドを呼び出します。
この誰かに当たるのが「デリゲート」になります。
デリゲートの制約
デリゲートが実行できるメソッドとしては、デリゲートと同じシグネチャ(引数の数、データ型、戻り値)をしたメソッドに限られます。
デリゲートのメリット
シグネチャさえ合っていれば呼び出すことができ、クラスをインスタンス化しなくても呼び出すことができるので、クラスを意識することなくメソッドを実行したい場合に使います。
構文
デリゲートの定義
1 |
Delegate Sub/Function デリゲート名 |
デリゲートのメソッドの登録
1 |
[アクセス修飾子] 変数名 As New 定義したデリゲート(AddressOf 登録するメソッド名) |
デリゲートはデータ型の一種なので、Asキーワードを使います。
サンプル
呼び出し先(デリゲートを呼び出すサンプル)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Module Module1 Sub Main() '人クラスの宣言 Dim human As New Human() 'callHumanデリゲートの宣言 Dim callHuman As CallHuman 'デリゲートにgetAgeメソッドを登録 callHuman = New CallHuman(AddressOf human.getAge) callHuman("田中", 23) 'デリゲートにgetSintyoメソッドを登録 callHuman = New CallHuman(AddressOf human.getSintyo) callHuman("山田", 170) Console.ReadLine() End Sub End Module |
呼び出し元(デリゲート及び、デリゲートとして登録されるメソッド)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Delegate Sub CallHuman(ByVal x As String, ByVal y As Integer) Public Class Human '年齢を表示する Public Sub getAge(ByVal name As String, ByVal age As Integer) Console.WriteLine(name + "さんの年齢は" + age.ToString + "です。") End Sub '身長を表示する。 Public Sub getSintyo(ByVal name As String, ByVal sintyo As Integer) Console.WriteLine(name + "さんの身長は" + sintyo.ToString + "です。") End Sub End Class |
デリゲートとして、登録するたびに実行結果が変わります。
マルチキャストデリゲート
上記例では、一つ一つデリゲートにメソッドを登録して呼び出していましたが、「マルチキャストデリゲート」を使うことで複数のメソッドをまとめて一気に呼び出すことが可能です。
サンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Module Module1 Sub Main() '人クラスの宣言 Dim human As New Human() 'Calculateデリゲートの宣言 Dim callHuman1 As CallHuman Dim callHuman2 As CallHuman 'デリゲートにgetAgeメソッドを登録 callHuman1 = New CallHuman(AddressOf human.getAge) 'デリゲートにgetSintyoメソッドを登録 callHuman2 = New CallHuman(AddressOf human.getSintyo) 'マルチキャストデリゲート callHuman1 = System.Delegate.Combine(callHuman1, callHuman2) callHuman1("田中", 170) Console.ReadLine() End Sub End Module |
この記事へのコメントはありません。