デリゲートの分散の使用 (C# および Visual Basic)

メソッドをデリゲートに割り当てると、共変性と反変性により、デリゲート型をメソッドのシグネチャに柔軟に一致させることができます。 共変性により、メソッドの戻り値の型の派生をデリゲートに定義されている型より強くすることができます。 また、反変性により、メソッドのパラメーター型の派生をデリゲート型より弱くすることができます。

例 1: 共変性

説明

この例では、デリゲートと、デリゲートのシグネチャ内の戻り値の型から派生した戻り値の型を持つメソッドの使用方法を説明します。 DogsHandler が返すデータ型は Dogs です。これは、デリゲートに定義された Mammals 型の派生型です。

コード

Class Mammals
End Class

Class Dogs
    Inherits Mammals
End Class
Class Test
    Public Delegate Function HandlerMethod() As Mammals
    Public Shared Function MammalsHandler() As Mammals
        Return Nothing
    End Function
    Public Shared Function DogsHandler() As Dogs
        Return Nothing
    End Function
    Sub Test()
        Dim handlerMammals As HandlerMethod = AddressOf MammalsHandler
        ' Covariance enables this assignment.
        Dim handlerDogs As HandlerMethod = AddressOf DogsHandler
    End Sub
End Class
class Mammals{}
class Dogs : Mammals{}

class Program
{
    // Define the delegate.
    public delegate Mammals HandlerMethod();

    public static Mammals MammalsHandler()
    {
        return null;
    }

    public static Dogs DogsHandler()
    {
        return null;
    }

    static void Test()
    {
        HandlerMethod handlerMammals = MammalsHandler;

        // Covariance enables this assignment.
        HandlerMethod handlerDogs = DogsHandler;
    }
}

例 2: 反変性

説明

この例では、デリゲートと、デリゲートのシグネチャのパラメーター型の基本型のパラメーターを持つメソッドの使用方法を説明します。 反変性により、複数のハンドラーの代わりに単一のイベント ハンドラーを使用できます。 たとえば、EventArgs 入力パラメーターを受け付けるイベント ハンドラーを作成し、MouseEventArgs 型のパラメーターを送信する Button.MouseClick イベントや KeyEventArgs パラメーターを送信する TextBox.KeyDown イベントで使用できます。

コード

' Event hander that accepts a parameter of the EventArgs type.
Private Sub MultiHandler(ByVal sender As Object,
                         ByVal e As System.EventArgs)
    Label1.Text = DateTime.Now
End Sub

Private Sub Form1_Load(ByVal sender As System.Object,
    ByVal e As System.EventArgs) Handles MyBase.Load

    ' You can use a method that has an EventArgs parameter,
    ' although the event expects the KeyEventArgs parameter.
    AddHandler Button1.KeyDown, AddressOf MultiHandler

    ' You can use the same method 
    ' for the event that expects the MouseEventArgs parameter.
    AddHandler Button1.MouseClick, AddressOf MultiHandler
End Sub
// Event hander that accepts a parameter of the EventArgs type.
private void MultiHandler(object sender, System.EventArgs e)
{
    label1.Text = System.DateTime.Now.ToString();
}

public Form1()
{
    InitializeComponent();

    // You can use a method that has an EventArgs parameter,
    // although the event expects the KeyEventArgs parameter.
    this.button1.KeyDown += this.MultiHandler;

    // You can use the same method 
    // for an event that expects the MouseEventArgs parameter.
    this.button1.MouseClick += this.MultiHandler;

}

参照

参照

Func および Action 汎用デリゲートでの分散の使用 (C# および Visual Basic)

概念

デリゲートの分散 (C# および Visual Basic)