Kovarianz und Kontravarianz in Delegaten (C#-Programmierhandbuch)
Aktualisiert: November 2007
Kovarianz und Kontravarianz bieten beim Abgleichen von Methodensignaturen mit Delegattypen ein gewisses Maß an Flexibilität. Kovarianz unterstützt eine Methode mit einem stärker abgeleiteten Rückgabetyp, als im Delegaten definiert wurde. Kontravarianz unterstützt eine Methode mit Parametertypen, die weniger stark abgeleitet sind als im Delegattyp.
Beispiel 1 (Kovarianz)
Beschreibung
Anhand dieses Beispiels wird veranschaulicht, wie Delegaten mit Methoden verwendet werden können, deren Rückgabetypen von dem Rückgabetyp in der Delegatsignatur abgeleitet wird. Der von SecondHandler zurückgegebene Datentyp entspricht dem Typ Dogs, der sich von dem im Delegaten definierten Mammals-Typ ableitet.
Code
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;
}
}
Beispiel 2 (Kontravarianz)
Beschreibung
Anhand dieses Beispiels wird veranschaulicht, wie Delegaten mit Methoden verwendet werden können, deren Parametertyp den Basistypen des Parametertyps in der Delegatsignatur entspricht. Mithilfe von Kontravarianz können Sie nun einen Ereignishandler verwenden, wo zuvor separate Handler erforderlich waren. Beispielsweise können Sie jetzt einen Ereignishandler erstellen, der einen EventArgs-Eingabeparameter akzeptiert, und ihn mit dem Button.MouseClick-Ereignis verwenden, das einen MouseEventArgs-Parameter sendet, oder mit dem TextBox.KeyDown-Ereignis, das einen KeyEventArgs-Parameter sendet.
Code
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;
}
Siehe auch
Konzepte
Referenz
Ereignisse (C#-Programmierhandbuch)