[C#] delegate part 3 (covariance)

delegate covariance
classical inheritance( “is-a”の関係)の子classであればベースクラスを返すdelegate typeのobjectとして子classを返すhandlerを宣言できる。
covarianceは日本語では共変性と訳す。
C#の入門書として読んだ本には以下のような例が出ていた。
Carというclassの子classとしてSportsCarが定義されている。
delegateはCarを返すものだけを定義し、このdelegate typeのobjectとしてCarを返すhandlerとSportsCarを返すhandlerを宣言する。

public delegate Car ObtainVehicleDelegate();
public Car GetaCar
{
return new Car();
}
public SportsCar GetaSportsCar
{
return new SportsCar();
}
ObtainVehicleDelegate a = new ObtainVehicleDelegate(GetaCar);
ObtainVehicleDelegate b = new ObtainVehicleDelegate(GetaSportsCar);

これと対になる概念として、引数にbase classを持つハンドラは、子classを持つハンドラとして使うことができることをcontravariance(反変性)という。
「デリゲートの共変性と反変性」(日本語訳)
http://msdn.microsoft.com/ja-jp/library/ms173174.aspx
ここの例だと

private void MultiHandler(object sender, System.EventArgs e)
{
lastActivity = System.DateTime.Now;
}

という関数を定義し、これを、2つのイベントからcallbackさせる。
例では、KeyDownイベントとMouseClickイベントの2つから同じ関数を呼ばせる。それぞれのイベントのハンドラーの二番目の引数がEventArgsのderived classになっている。
そのおかげでどちらのイベントからもEventArgsを引数とするMultiHandlerを呼べる、ということである。

this.textBox1.KeyDown += this.MultiHandler; //works with KeyEventArgs
広告
%d人のブロガーが「いいね」をつけました。