Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Eine kovariante Schnittstelle ermöglicht es seinen Methoden, mehr abgeleitete Typen zurückzugeben als die in der Schnittstelle angegebenen. Eine kontravariante Schnittstelle ermöglicht es seinen Methoden, Parameter von weniger abgeleiteten Typen als die in der Schnittstelle angegebenen zu akzeptieren.
In .NET Framework 4 wurden mehrere vorhandene Schnittstellen kovariant und kontravariant. Dazu gehören IEnumerable<T> und IComparable<T>. Auf diese Weise können Sie Methoden wiederverwenden, die mit generischen Auflistungen von Basistypen für Sammlungen abgeleiteter Typen arbeiten.
Eine Liste der Variantenschnittstellen in .NET Framework finden Sie unter Varianz in Generic Interfaces (Visual Basic).For a list of variant interfaces in the .NET Framework, see Variance in Generic Interfaces (Visual Basic).
Konvertieren von generischen Auflistungen
Das folgende Beispiel veranschaulicht die Vorteile der Kovarianzunterstützung in der IEnumerable<T> Schnittstelle. Die PrintFullName Methode akzeptiert eine Auflistung des IEnumerable(Of Person) Typs als Parameter. Sie können dies jedoch für eine Auflistung des Typs IEnumerable(Of Person) wiederverwenden, da EmployeePerson erbt.
' Simple hierarchy of classes.
Public Class Person
Public Property FirstName As String
Public Property LastName As String
End Class
Public Class Employee
Inherits Person
End Class
' The method has a parameter of the IEnumerable(Of Person) type.
Public Sub PrintFullName(ByVal persons As IEnumerable(Of Person))
For Each person As Person In persons
Console.WriteLine(
"Name: " & person.FirstName & " " & person.LastName)
Next
End Sub
Sub Main()
Dim employees As IEnumerable(Of Employee) = New List(Of Employee)
' You can pass IEnumerable(Of Employee),
' although the method expects IEnumerable(Of Person).
PrintFullName(employees)
End Sub
Vergleich generischer Sammlungen
Das folgende Beispiel veranschaulicht die Vorteile der Kontravarianzunterstützung in der IComparer<T> Schnittstelle. Der PersonComparer-Klasse implementiert die IComparer(Of Person)-Schnittstelle. Sie können diese Klasse jedoch wiederverwenden, um eine Abfolge von Objekten des Employee Typs zu vergleichen, da Employee sie erbt Person.
' Simple hierarchy of classes.
Public Class Person
Public Property FirstName As String
Public Property LastName As String
End Class
Public Class Employee
Inherits Person
End Class
' The custom comparer for the Person type
' with standard implementations of Equals()
' and GetHashCode() methods.
Class PersonComparer
Implements IEqualityComparer(Of Person)
Public Function Equals1(
ByVal x As Person,
ByVal y As Person) As Boolean _
Implements IEqualityComparer(Of Person).Equals
If x Is y Then Return True
If x Is Nothing OrElse y Is Nothing Then Return False
Return (x.FirstName = y.FirstName) AndAlso
(x.LastName = y.LastName)
End Function
Public Function GetHashCode1(
ByVal person As Person) As Integer _
Implements IEqualityComparer(Of Person).GetHashCode
If person Is Nothing Then Return 0
Dim hashFirstName =
If(person.FirstName Is Nothing,
0, person.FirstName.GetHashCode())
Dim hashLastName = person.LastName.GetHashCode()
Return hashFirstName Xor hashLastName
End Function
End Class
Sub Main()
Dim employees = New List(Of Employee) From {
New Employee With {.FirstName = "Michael", .LastName = "Alexander"},
New Employee With {.FirstName = "Jeff", .LastName = "Price"}
}
' You can pass PersonComparer,
' which implements IEqualityComparer(Of Person),
' although the method expects IEqualityComparer(Of Employee)
Dim noduplicates As IEnumerable(Of Employee) = employees.Distinct(New PersonComparer())
For Each employee In noduplicates
Console.WriteLine(employee.FirstName & " " & employee.LastName)
Next
End Sub