Použití odchylky v rozhraní pro obecné kolekce (C# and Visual Basic)

Covariant rozhraní umožňuje jeho metody vrátit více odvozené typy, než je uvedeno v rozhraní.Contravariant rozhraní umožňuje přijímat parametry méně odvozené typy než ty zadaný v rozhraní jeho metody.

V.NET Framework 4, několik existující rozhraní, které se stanou covariant a contravariant.Jedná se o IEnumerable a IComparable.Můžete opakovaně používat metody, které pracují s obecný základní typy kolekcí odvozené typy kolekcí.

Seznam variant rozhraní v.NET Framework, viz Odchylky obecných rozhraní (C# and Visual Basic).

Převod obecný kolekce

Následující příklad ukazuje výhody podpory Kovariance v IEnumerable rozhraní.PrintFullName Metoda přijímá kolekce IEnumerable<Person> typu (IEnumerable(Of Person) v jazyce Visual Basic) jako parametr.Však jej můžete znovu použít pro kolekci IEnumerable<Employee> typu (IEnumerable(Of Person) v jazyce Visual Basic) protože Employee dědí 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 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

Porovnání obecný kolekce

Následující příklad ukazuje výhody v contravariance podporu IComparer rozhraní.PersonComparer Třída implementuje IComparer<Person> rozhraní (IComparer(Of Person) v jazyce Visual Basic).Však můžete znovu použít tuto třídu porovnat posloupnost objektů Employee zadejte, protože Employee dědí Person.

' Simple hierarhcy 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

Viz také

Koncepty

Odchylky obecných rozhraní (C# and Visual Basic)