Delegate ステートメント
デリゲートを宣言します。 デリゲートとは、型の Shared メソッド、またはオブジェクトのインスタンス メソッドを参照する参照型です。 パラメーターの型と戻り値の型が一致するプロシージャを使って、このデリゲート クラスのインスタンスを作成できます。 デリゲート インスタンスの作成後は、そのインスタンスを経由してプロシージャを起動できます。
[ <attrlist> ] [ accessmodifier ] _
[ Shadows ] Delegate [ Sub | Function ] name [( Of typeparamlist )] [([ parameterlist ])] [ As type ]
指定項目
語句 |
定義 |
attrlist |
省略可能です。 このデリゲートに適用される属性の一覧を指定します。 複数の属性を指定するときは、コンマ (,) で区切ります。 属性リスト (Visual Basic) は、山かっこ (< および >) で囲む必要があります。 |
accessmodifier |
省略可能です。 どのようなコードからデリゲートにアクセスできるのかを指定します。 次のいずれかの値を指定します。
Protected Friend と指定すると、デリゲートのクラス、その派生クラス、または同じアセンブリ内のコードからのみアクセスできます。 |
Shadows |
省略可能です。 このデリゲートが、基本クラスにある、同じ名前を持つプログラミング要素、またはオーバーロードされる要素を宣言し直すことを示します。 宣言された要素は、他の任意の種類の要素でシャドウできます。 シャドウされた要素は、その要素をシャドウする派生クラスからは使用できません。ただし、シャドウする要素がアクセスできない要素の場合は例外です。 たとえば、Private 要素が基本クラスの要素をシャドウした場合、その Private 要素へのアクセス許可を持たないコードは、基本クラスの要素へ代わりにアクセスします。 |
Sub |
省略できます。ただし、Sub か Function のどちらかを指定する必要があります。 指定するプロシージャが、値を返さないデリゲートの Sub プロシージャとして宣言されることを示します。 |
Function |
省略できます。ただし、Sub か Function のどちらかを指定する必要があります。 指定するプロシージャが、値を返すデリゲートの Function プロシージャとして宣言されることを示します。 |
name |
必ず指定します。 デリゲート型の名前を指定します。デリゲート型の標準的な名前付け規則に従って名前を付けます。 |
typeparamlist |
省略可能です。 このデリゲートの型パラメーターを一覧表示します。 複数の型パラメーターがある場合は、コンマ (,) で区切られます。 必要に応じて、ジェネリックの In 修飾子や Out 修飾子を使用して、それぞれの型パラメーターをバリアントとして宣言できます。 型リスト (Visual Basic) はかっこで囲み、冒頭に Of キーワードを付けます。 |
parameterlist |
省略可能です。 プロシージャが呼び出されたときに渡されるパラメーターのリストです。 パラメーターの一覧 (Visual Basic) はかっこで囲む必要があります。 |
type |
Function プロシージャを指定する場合は、必ず指定します。 戻り値のデータ型を指定します。 |
解説
Delegate ステートメントでは、デリゲート クラスのパラメーターの型と戻り値の型を定義します。 パラメーターの型と戻り値の型が一致するプロシージャを使って、このデリゲート クラスのインスタンスを作成できます。 デリゲート インスタンスの作成後は、デリゲートの Invoke メソッドを呼び出すことで、そのインスタンスを経由してプロシージャを起動できます。
デリゲートは、名前空間、モジュール、クラス、構造体レベルで宣言できますが、プロシージャ内では宣言できません。
各デリゲート クラスでは、オブジェクト メソッドの仕様を渡すコンストラクターを定義します。 デリゲート コンストラクターに渡す引数は、メソッドへの参照、またはラムダ式である必要があります。
メソッドへの参照を指定するには、次の構文を使用します。
AddressOf [expression.]methodname
コンパイル時の expression の型は、シグネチャがデリゲート クラスのシグネチャと同じで、指定された名前のメソッドを持つクラスまたはインターフェイスである必要があります。 methodname は、共有メソッドまたはインスタンス メソッドのいずれかにできます。 クラスの既定メソッドに対してデリゲートを作成する場合も、methodname は省略できません。
ラムダ式を指定するには、次の構文を使用します。
Function ([parm As type, parm2 As type2, ...]) expression
関数のシグネチャは、デリゲート型のシグネチャと一致している必要があります。 ラムダ式の詳細については、「ラムダ式 (Visual Basic)」を参照してください。
使用例
次の例では、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
参照
処理手順
方法: ジェネリック クラスを使用する (Visual Basic)
参照
Out (ジェネリック修飾子) (Visual Basic)
概念
Visual Basic におけるジェネリック型 (Visual Basic)