Masuk (Pengubah Generik) (Visual Basic)
Untuk parameter jenis generik, kata kunci In
menentukan bahwa parameter jenisnya adalah kontravarian.
Keterangan
Kontravarian memungkinkan Anda untuk menggunakan jenis turunan yang lebih sedikit daripada yang ditentukan oleh parameter generik. Hal ini mengizinkan konversi implisit kelas yang mengimplementasikan antarmuka varian dan konversi implisit jenis delegasi.
Untuk informasi selengkapnya, lihat Kovarian dan Kontravarian.
Aturan
Anda dapat menggunakan kata kunci In
di antarmuka generik dan delegasi.
Parameter jenis dapat dinyatakan kontravarian dalam antarmuka generik atau delegasi jika hanya digunakan sebagai jenis argumen metode dan tidak digunakan sebagai jenis pengembalian metode. Parameter ByRef
tidak boleh berupa kovarian atau kontravarian.
Kovarian dan kontravarian didukung untuk jenis referensi, tetapi tidak didukung untuk jenis nilai.
Dalam Visual Basic, Anda tidak dapat mendeklarasikan peristiwa dalam antarmuka kovarian tanpa menentukan jenis delegasi. Selain itu, antarmuka kovarian tidak dapat memiliki kelas, enum, atau struktur bersarang, tetapi mereka dapat memiliki antarmuka bersarang.
Perilaku
Antarmuka yang memiliki parameter jenis kontravarian memungkinkan metodenya menerima argumen dari jenis turunan yang lebih sedikit daripada yang ditentukan oleh parameter jenis antarmuka. Misalnya, karena di .NET Framework 4, di antarmuka IComparer<T>, jenis T adalah kontravarian, Anda dapat menetapkan objek berjenis IComparer(Of Person)
ke objek berjenis IComparer(Of Employee)
tanpa menggunakan metode konversi khusus apa pun jika Employee
mewarisi Person
.
Delegasi kontravarian dapat diberikan delegasi lain dengan jenis yang sama, tetapi dengan parameter jenis generik yang lebih sedikit diturunkan.
Contoh - Antarmuka generik kontravarian
Contoh berikut menunjukkan cara mendeklarasikan, memperluas, dan menerapkan antarmuka generik kontravarian. Ini juga menunjukkan bagaimana Anda dapat menggunakan konversi implisit untuk kelas yang menerapkan antarmuka ini.
' Contravariant interface.
Interface IContravariant(Of In A)
End Interface
' Extending contravariant interface.
Interface IExtContravariant(Of In A)
Inherits IContravariant(Of A)
End Interface
' Implementing contravariant interface.
Class Sample(Of A)
Implements IContravariant(Of A)
End Class
Sub Main()
Dim iobj As IContravariant(Of Object) = New Sample(Of Object)()
Dim istr As IContravariant(Of String) = New Sample(Of String)()
' You can assign iobj to istr, because
' the IContravariant interface is contravariant.
istr = iobj
End Sub
Contoh - Delegasi generik kontravarian
Contoh berikut menunjukkan cara mendeklarasikan, membuat instans, dan memanggil delegasi generik kontravarian. Ini juga menunjukkan bagaimana Anda dapat secara implisit mengonversi jenis delegasi.
' Contravariant delegate.
Public Delegate Sub DContravariant(Of In A)(ByVal argument As A)
' Methods that match the delegate signature.
Public Shared Sub SampleControl(ByVal control As Control)
End Sub
Public Shared Sub SampleButton(ByVal control As Button)
End Sub
Private Sub Test()
' Instantiating the delegates with the methods.
Dim dControl As DContravariant(Of Control) =
AddressOf SampleControl
Dim dButton As DContravariant(Of Button) =
AddressOf SampleButton
' You can assign dControl to dButton
' because the DContravariant delegate is contravariant.
dButton = dControl
' Invoke the delegate.
dButton(New Button())
End Sub