デリゲートにメソッドを割り当てると、 共変性 と 反変性 によって、デリゲート型とメソッド シグネチャを柔軟に照合できます。 共変性により、メソッドの戻り値の型の派生を、デリゲートに定義されている型よりも強くできます。 反変性により、デリゲート型のメソッドよりも派生度の低いパラメーター型を持つメソッドが許可されます。
例 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: 反変性
説明
この例は、型がデリゲート シグネチャ パラメーター型の基本データ型であるパラメーターを持つメソッドでデリゲートを使用する方法を示しています。 反変性では、個別のハンドラーの代わりに 1 つのイベント ハンドラーを使用できます。 次の例では、2 つのデリゲートを使用します。
KeyEventHandler イベントのシグネチャを定義するデリゲート。 そのシグネチャは次のとおりです。
public delegate void KeyEventHandler(object sender, KeyEventArgs e)
MouseEventHandler イベントのシグネチャを定義するデリゲート。 そのシグネチャは次のとおりです。
public delegate void MouseEventHandler(object sender, MouseEventArgs e)
この例では、 EventArgs パラメーターを持つイベント ハンドラーを定義し、それを使用して Button.KeyDown
イベントと Button.MouseClick
イベントの両方を処理します。 これは、 EventArgs が KeyEventArgs と MouseEventArgsの両方の基本型であるためです。
コード
// 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;
}
こちらも参照ください
.NET