委派中的 Covariance 和 Contravariance (C# 程式設計手冊)
更新:2007 年 11 月
Covariance 和 contravariance 在將方法簽章與委派型別比對時,會提供某種程度的彈性。Covariance 允許方法擁有比定義於委派內更多的衍生傳回型別,Contravariance 則允許方法擁有比委派型別 (Delegate Type) 內更少的衍生參數型別。
範例 1 (Covariance)
描述
這個範例會示範如何搭配具有傳回型別的方法來使用委派,該傳回型別是衍生自委派簽章內的傳回型別。由 SecondHandler 傳回的資料型別具有 Dogs 型別,該型別是衍生自委派內所定義的 Mammals 型別。
錯誤碼
class Mammals
{
}
class Dogs : Mammals
{
}
class Program
{
// Define the delegate.
public delegate Mammals HandlerMethod();
public static Mammals FirstHandler()
{
return null;
}
public static Dogs SecondHandler()
{
return null;
}
static void Main()
{
HandlerMethod handler1 = FirstHandler;
// Covariance allows this delegate.
HandlerMethod handler2 = SecondHandler;
}
}
範例 2 (Contravariance)
描述
這個範例將示範如何搭配具有型別之參數的方法來使用委派,該型別是委派簽章參數型別的基底型別 (Base Type)。現在有了 Contravariance,您就可以在先前必須使用個別處理常式的地方使用一個事件處理常式。例如,您現在可以建立接受 EventArgs 輸入參數的事件處理常式,並與傳送 MouseEventArgs 型別當做參數的 Button.MouseClick 事件一起使用,同時也可以與傳送 KeyEventArgs 參數的 TextBox.KeyDown 事件一起使用。
錯誤碼
System.DateTime lastActivity;
public Form1()
{
InitializeComponent();
lastActivity = new System.DateTime();
this.textBox1.KeyDown += this.MultiHandler; //works with KeyEventArgs
this.button1.MouseClick += this.MultiHandler; //works with MouseEventArgs
}
// Event hander for any event with an EventArgs or
// derived class in the second parameter
private void MultiHandler(object sender, System.EventArgs e)
{
lastActivity = System.DateTime.Now;
}