Delegate ステートメント
更新 : 2007 年 11 月
デリゲートを宣言します。デリゲートとは、型の Shared メソッド、またはオブジェクトのインスタンス メソッドを参照する参照型です。パラメータの型と戻り値の型が一致するプロシージャを使って、このデリゲート クラスのインスタンスを作成できます。デリゲート インスタンスの作成後は、そのインスタンスを経由してプロシージャを起動できます。
[ <attrlist> ] [ accessmodifier ] _
[ Shadows ] Delegate [ Sub | Function ] name [( Of typeparamlist )] [([ parameterlist ])] [ As type ]
指定項目
attrlist
省略可能です。このデリゲートに適用される属性の一覧を指定します。複数の属性を指定するときは、コンマ (,) で区切ります。属性リスト は、山かっこ (< および >) で囲む必要があります。accessmodifier
省略可能です。どのようなコードからデリゲートにアクセスできるのかを指定します。次のいずれかの値を指定します。Publicデリゲートを宣言した要素にアクセスできるすべてのコードがアクセスできます。
Protectedデリゲートのクラス内のコード、または派生クラスのみがアクセスできます。
Friendデリゲートと同じアセンブリ内のコードだけがアクセスできます。
Privateデリゲートを宣言した要素内のコードだけがアクセスできます。
Protected Friend と指定すると、デリゲートのクラス、その派生クラス、または同じアセンブリ内のコードからのみアクセスできます。
Shadows
省略可能です。このデリゲートが、基本クラスにある、同じ名前を持つプログラミング要素、またはオーバーロードされる要素を宣言し直すことを示します。宣言された要素は、他の任意の種類の要素でシャドウできます。シャドウされた要素は、その要素をシャドウする派生クラスからは使用できません。ただし、シャドウする要素がアクセスできない要素の場合は例外です。たとえば、Private 要素が基本クラスの要素をシャドウすると、Private 要素へのアクセス許可を持たないコードは、基本クラスにアクセスします。
Sub
省略できます。ただし、Sub か Function のどちらかを指定する必要があります。指定するプロシージャが、値を返さないデリゲートの Sub プロシージャとして宣言されることを示します。Function
省略できます。ただし、Sub か Function のどちらかを指定する必要があります。指定するプロシージャが、値を返すデリゲートの Function プロシージャとして宣言されることを示します。name
必ず指定します。デリゲート型の名前を指定します。デリゲート型の標準的な名前付け規則に従って名前を付けます。typeparamlist
省略可能です。このデリゲートの型パラメータを一覧表示します。複数の型パラメータがある場合は、コンマ (,) で区切られます。型リスト はかっこで囲み、冒頭に Of キーワードを付けます。parameterlist
省略可能です。プロシージャが呼び出されたときに渡されるパラメータのリストです。パラメータの一覧 はかっこで囲む必要があります。type
Function プロシージャを指定する場合は、必ず指定します。戻り値のデータ型を指定します。
解説
Delegate ステートメントでは、デリゲート クラスのパラメータの型と戻り値の型を定義します。パラメータの型と戻り値の型が一致するプロシージャを使って、このデリゲート クラスのインスタンスを作成できます。デリゲート インスタンスの作成後は、デリゲートの Invoke メソッドを呼び出すことで、そのインスタンスを経由してプロシージャを起動できます。
デリゲートは、名前空間、モジュール、クラス、構造体レベルで宣言できますが、プロシージャ内では宣言できません。
各デリゲート クラスでは、オブジェクト メソッドの仕様を渡すコンストラクタを定義します。デリゲート コンストラクタに渡す引数は、メソッドへの参照、またはラムダ式である必要があります。
メソッドへの参照を指定するには、次の構文を使用します。
AddressOf [expression.]methodname
コンパイル時の expression の型は、シグネチャがデリゲート クラスのシグネチャと同じで、指定された名前のメソッドを持つクラスまたはインターフェイスである必要があります。methodname は、共有メソッドまたはインスタンス メソッドのいずれかにできます。クラスの既定メソッドに対してデリゲートを作成する場合も、methodname は省略できません。
ラムダ式を指定するには、次の構文を使用します。
Function ([parm As type, parm2 As type2, ...]) expression
関数のシグネチャは、デリゲート型のシグネチャと一致している必要があります。ラムダ式の詳細については、「ラムダ式」を参照してください。
使用例
次の例では、Delegate ステートメントを使って、2 つの数字を操作して数字を返すデリゲートを宣言します。DelegateTest メソッドはこのデリゲートの型のインスタンスを受け取り、デリゲートを使って 1 組の数字を操作します。
Delegate Function MathOperator( _
ByVal x As Double, _
ByVal y As Double _
) As Double
Function AddNumbers( _
ByVal x As Double, _
ByVal y As Double _
) As Double
Return x + y
End Function
Function SubtractNumbers( _
ByVal x As Double, _
ByVal y As Double _
) As Double
Return x - y
End Function
Sub DelegateTest( _
ByVal x As Double, _
ByVal op As MathOperator, _
ByVal y As Double _
)
Dim ret As Double
ret = op.Invoke(x, y) ' Call the method.
MsgBox(ret)
End Sub
Protected Sub Test()
DelegateTest(5, AddressOf AddNumbers, 3)
DelegateTest(9, AddressOf SubtractNumbers, 3)
End Sub