Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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