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

参照

処理手順

方法 : ジェネリック クラスを使用する

概念

Visual Basic におけるジェネリック型

参照

AddressOf 演算子

Of

その他の技術情報

Visual Basic でのデリゲート