Bagikan melalui


Varians dalam Antarmuka Generik (Visual Basic)

.NET Framework 4 memperkenalkan dukungan varians untuk beberapa antarmuka generik yang ada. Dukungan varians memungkinkan konversi implisit kelas yang mengimplementasikan antarmuka ini. Antarmuka berikut sekarang merupakan varian:

Kovarian memungkinkan suatu metode untuk memiliki jenis pengembalian yang lebih spesifik daripada yang ditentukan oleh parameter jenis generik dari antarmuka. Untuk mengilustrasikan fitur kovarians, pertimbangkan antarmuka generik ini: IEnumerable(Of Object) dan IEnumerable(Of String). Antarmuka IEnumerable(Of String) tidak mewarisi IEnumerable(Of Object) antarmuka. Namun, jenis String mewarisi jenis Object, dan dalam beberapa kasus Anda mungkin ingin menetapkan objek dari antarmuka ini satu sama lain. Ini ditunjukkan dalam contoh kode berikut.

Dim strings As IEnumerable(Of String) = New List(Of String)
Dim objects As IEnumerable(Of Object) = strings

Dalam versi .NET Framework yang lebih lama, kode ini menyebabkan kesalahan kompilasi di Visual Basic dengan Option Strict On. Tetapi sekarang Anda dapat menggunakan strings alih-alih objects, seperti yang ditunjukkan pada contoh sebelumnya, karena IEnumerable<T> antarmukanya kovarian.

Kontravarian memungkinkan metode untuk memiliki jenis argumen yang kurang diturunkan dari yang ditentukan oleh parameter generik antarmuka. Untuk mengilustrasikan kontravariansi, asumsikan bahwa Anda telah membuat BaseComparer kelas untuk membandingkan BaseClass instans kelas. Kelas BaseComparer menerapkan antarmuka IEqualityComparer(Of BaseClass). Karena antarmuka IEqualityComparer<T> sekarang kontravarian, Anda dapat menggunakan BaseComparer untuk membandingkan instans kelas yang mewarisi kelas BaseClass. Ini ditunjukkan dalam contoh kode berikut.

' Simple hierarchy of classes.
Class BaseClass
End Class

Class DerivedClass
    Inherits BaseClass
End Class

' Comparer class.
Class BaseComparer
    Implements IEqualityComparer(Of BaseClass)

    Public Function Equals1(ByVal x As BaseClass,
                            ByVal y As BaseClass) As Boolean _
                            Implements IEqualityComparer(Of BaseClass).Equals
        Return (x.Equals(y))
    End Function

    Public Function GetHashCode1(ByVal obj As BaseClass) As Integer _
        Implements IEqualityComparer(Of BaseClass).GetHashCode
        Return obj.GetHashCode
    End Function
End Class
Sub Test()
    Dim baseComparer As IEqualityComparer(Of BaseClass) = New BaseComparer
    ' Implicit conversion of IEqualityComparer(Of BaseClass) to
    ' IEqualityComparer(Of DerivedClass).
    Dim childComparer As IEqualityComparer(Of DerivedClass) = baseComparer
End Sub

Untuk contoh selengkapnya, lihat Menggunakan Varians di Antarmuka untuk Koleksi Generik (Visual Basic).

Varians dalam antarmuka generik hanya didukung untuk tipe referensi. Tipe nilai tidak mendukung keberagaman. Misalnya, IEnumerable(Of Integer) tidak dapat dikonversi secara implisit ke IEnumerable(Of Object), karena bilangan bulat diwakili oleh jenis nilai.

Dim integers As IEnumerable(Of Integer) = New List(Of Integer)
' The following statement generates a compiler error
' with Option Strict On, because Integer is a value type.
' Dim objects As IEnumerable(Of Object) = integers

Penting juga untuk diingat bahwa kelas yang mengimplementasikan antarmuka varian masih invarian. Misalnya, meskipun List<T> mengimplementasikan antarmuka IEnumerable<T>kovarian , Anda tidak dapat secara implisit mengonversi List(Of Object) ke List(Of String). Ini diilustrasikan dalam contoh kode berikut.

' The following statement generates a compiler error
' because classes are invariant.
' Dim list As List(Of Object) = New List(Of String)

' You can use the interface object instead.
Dim listObjects As IEnumerable(Of Object) = New List(Of String)

Lihat juga