Verwenden von Varianz in Delegaten (C# und Visual Basic)
Wenn Sie einem Delegaten eine Methode zuweisen, bieten Kovarianz und Kontravarianz Flexibilität beim Abgleich eines Delegattyps mit einer Methodensignatur. 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 die 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 DogsHandler zurückgegebene Datentyp entspricht dem Typ Dogs, der sich von dem im Delegaten definierten Mammals-Typ ableitet.
Code
Class Mammals
End Class
Class Dogs
Inherits Mammals
End Class
Class Test
Public Delegate Function HandlerMethod() As Mammals
Public Shared Function MammalsHandler() As Mammals
Return Nothing
End Function
Public Shared Function DogsHandler() As Dogs
Return Nothing
End Function
Sub Test()
Dim handlerMammals As HandlerMethod = AddressOf MammalsHandler
' Covariance enables this assignment.
Dim handlerDogs As HandlerMethod = AddressOf DogsHandler
End Sub
End Class
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;
}
}
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. Mit Kontravarianz können Sie einen Ereignishandler anstelle von separaten Handlern verwenden. Sie können z. B. einen Ereignishandler erstellen, der einen EventArgs-Eingabeparameter akzeptiert, und ihn mit einem Button.MouseClick-Ereignis verwenden, das einen MouseEventArgs-Typ als Parameter sendet, oder auch mit einem TextBox.KeyDown-Ereignis, das einen KeyEventArgs-Parameter sendet.
Code
' Event hander that accepts a parameter of the EventArgs type.
Private Sub MultiHandler(ByVal sender As Object,
ByVal e As System.EventArgs)
Label1.Text = DateTime.Now
End Sub
Private Sub Form1_Load(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles MyBase.Load
' You can use a method that has an EventArgs parameter,
' although the event expects the KeyEventArgs parameter.
AddHandler Button1.KeyDown, AddressOf MultiHandler
' You can use the same method
' for the event that expects the MouseEventArgs parameter.
AddHandler Button1.MouseClick, AddressOf MultiHandler
End Sub
// Event hander 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;
}
Siehe auch
Referenz
Verwenden von Varianz für die generischen Delegaten Func und Action (C# und Visual Basic)