Bagikan melalui


Menggunakan Varians dalam Antarmuka untuk Koleksi Generik (Visual Basic)

Antarmuka kovarian memungkinkan metodenya untuk mengembalikan jenis yang lebih turunan daripada yang ditentukan dalam antarmuka. Antarmuka kontravarian memungkinkan metodenya menerima parameter dari jenis yang kurang turunan dibandingkan dengan yang ditentukan dalam antarmuka.

Dalam .NET Framework 4, beberapa antarmuka yang ada menjadi kovarian dan kontravarian. Ini termasuk IEnumerable<T> dan IComparable<T>. Ini memungkinkan Anda menggunakan kembali metode yang beroperasi dengan koleksi generik jenis dasar untuk koleksi jenis turunan.

Untuk daftar antarmuka varian di .NET Framework, lihat Varians di Antarmuka Generik (Visual Basic).

Mengubah Koleksi Generik

Contoh berikut mengilustrasikan manfaat dukungan kovarians dalam IEnumerable<T> antarmuka. Metode PrintFullName ini menerima kumpulan jenis IEnumerable(Of Person) sebagai parameter. Namun, Anda dapat menggunakannya kembali untuk koleksi jenis IEnumerable(Of Person) karena Employee mewarisi 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

Membandingkan Koleksi Generik

Contoh berikut mengilustrasikan manfaat dukungan kontravariansi di IComparer<T> antarmuka. Kelas PersonComparer menerapkan antarmuka IComparer(Of Person). Namun, Anda dapat menggunakan kembali kelas ini untuk membandingkan urutan objek jenis Employee karena Employee mewarisi 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

Lihat juga