(0) exportieren Drucken
Alle erweitern

Kovarianz und Kontravarianz in Delegaten (C#-Programmierhandbuch)

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.

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.

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;
    }
}

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.

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;
}

Microsoft führt eine Onlineumfrage durch, um Ihre Meinung zur MSDN-Website zu erfahren. Wenn Sie sich zur Teilnahme entscheiden, wird Ihnen die Onlineumfrage angezeigt, sobald Sie die MSDN-Website verlassen.

Möchten Sie an der Umfrage teilnehmen?
Anzeigen:
© 2014 Microsoft