デリゲートの変性の使用 (C#)

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

例 1:共変性

説明

この例は、デリゲート シグネチャ内の戻り値の型から派生した戻り値の型を持つメソッドで、デリゲートをどのように使用できるかを示しています。 DogsHandler が返すデータ型は Dogs です。これは、デリゲートに定義された Mammals 型の派生型です。

コード

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:反変性

説明

この例は、型がデリゲート シグネチャ パラメーター型の基本データ型であるパラメーターを持つメソッドでデリゲートを使用する方法を示しています。 反変性により、複数のハンドラーの代わりに単一のイベント ハンドラーを使用できます。 次の例では、2 つのデリゲートを使用します。

  • Button.KeyDown イベントのシグネチャを定義する KeyEventHandler デリゲート。 そのシグネチャ:

    public delegate void KeyEventHandler(object sender, KeyEventArgs e)
    
  • Button.MouseClick イベントのシグネチャを定義する MouseEventHandler デリゲート。 そのシグネチャ:

    public delegate void MouseEventHandler(object sender, MouseEventArgs e)
    

この例では、イベント ハンドラーと EventArgs パラメーターが定義され、そのパラメーターを使用し、Button.KeyDownButton.MouseClick の両方のイベントが処理されます。 これが可能になるのは、EventArgsKeyEventArgsMouseEventArgs の両方の基本データ型であるためです。

コード

// Event handler 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;  
  
}  

関連項目