在委派中使用變異數 (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:反變數
描述
此範例示範如何搭配其參數類型為委派簽章參數類型的基底類型方法來使用委派。 透過反變數,您可以使用一個事件處理常式,而不是不同的處理常式。 下列範例會使用兩個委派:
KeyEventHandler 委派會定義 Button.KeyDown 事件的簽章。 其簽章為:
public delegate void KeyEventHandler(object sender, KeyEventArgs e)
MouseEventHandler 委派會定義 Button.MouseClick 事件的簽章。 其簽章為:
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;
}