Prosedur Generik dalam Visual Basic

Prosedur generik, disebut juga metode generik, adalah prosedur yang ditentukan dengan setidaknya satu parameter jenis. Prosedur ini memungkinkan kode panggilan untuk menyesuaikan jenis data dengan persyaratannya setiap kali memanggil prosedur.

Prosedur dianggap tidak generik hanya karena didefinisikan dalam kelas generik atau struktur generik. Untuk menjadi generik, prosedur ini harus mengambil setidaknya satu parameter jenis, selain parameter normal yang mungkin diperlukan. Kelas atau struktur generik dapat berisi prosedur non-generik. Kelas, struktur, atau modul non-generik dapat berisi prosedur generik.

Prosedur generik dapat menggunakan parameter jenisnya dalam daftar parameter normalnya, dalam jenis pengembaliannya (jika ada), dan dalam kode prosedurnya.

Inferensi jenis

Anda dapat memanggil prosedur generik tanpa memberikan argumen jenis sama sekali. Jika dipanggil dengan cara seperti ini, pengkompilasi mencoba untuk menentukan jenis data yang sesuai untuk diteruskan ke argumen jenis prosedur. Hal ini disebut inferensi jenis. Kode berikut menunjukkan panggilan di mana pengkompilasi menyimpulkan bahwa pengkompilasi harus meneruskan jenis String ke parameter jenis t.

Public Sub testSub(Of t)(ByVal arg As t)
End Sub
Public Sub callTestSub()
    testSub("Use this string")
End Sub

Jika pengkompilasi tidak dapat menyimpulkan jenis argumen dari konteks panggilan Anda, pengkompilasi tersebut melaporkan kesalahan. Salah satu kemungkinan penyebab kesalahan tersebut adalah ketidakcocokan peringkat array. Misalkan Anda menentukan parameter normal sebagai array parameter jenis. Jika Anda memanggil prosedur generik yang menyediakan array dari peringkat yang berbeda (jumlah dimensi), ketidakcocokan ini menyebabkan kegagalan inferensi jenis. Kode berikut menunjukkan panggilan di mana array dua dimensi diteruskan ke prosedur yang mengharapkan array satu dimensi.

Public Sub demoSub(Of t)(ByVal arg() As t)
End Sub

Public Sub callDemoSub()
    Dim twoDimensions(,) As Integer
    demoSub(twoDimensions)
End Sub

Anda dapat memanggil inferensi jenis hanya dengan menghilangkan semua argumen jenis. Jika Anda menawarkan satu jenis argumen, Anda harus menyediakan semuanya.

Inferensi jenis hanya didukung untuk prosedur generik. Anda tidak dapat memanggil inferensi jenis pada kelas, struktur, antarmuka, atau delegasi generik.

Contoh

Deskripsi

Contoh berikut mendefinisikan prosedur generik Function untuk menemukan elemen tertentu dalam array. Contoh ini mendefinisikan satu parameter jenis dan menggunakannya untuk membangun dua parameter dalam daftar parameter.

Kode

Public Function findElement(Of T As IComparable) (
        ByVal searchArray As T(), ByVal searchValue As T) As Integer

    If searchArray.GetLength(0) > 0 Then
        For i As Integer = 0 To searchArray.GetUpperBound(0)
            If searchArray(i).CompareTo(searchValue) = 0 Then Return i
        Next i
    End If

    Return -1
End Function

Komentar

Contoh sebelumnya memerlukan kemampuan untuk membandingkan searchValue dengan setiap elemen searchArray. Untuk menjamin kemampuan ini, parameter jenis T terbatas untuk mengimplementasikan antarmuka IComparable<T>. Kode tersebut menggunakan metode CompareTo dan bukan operator =, karena tidak ada jaminan bahwa argumen jenis yang disediakan untuk T mendukung operator =.

Anda dapat menguji prosedur findElement dengan kode berikut.

Public Sub tryFindElement()
    Dim stringArray() As String = {"abc", "def", "xyz"}
    Dim stringSearch As String = "abc"
    Dim integerArray() As Integer = {7, 8, 9}
    Dim integerSearch As Integer = 8
    Dim dateArray() As Date = {#4/17/1969#, #9/20/1998#, #5/31/2004#}
    Dim dateSearch As Date = Microsoft.VisualBasic.DateAndTime.Today
    MsgBox(CStr(findElement(Of String)(stringArray, stringSearch)))
    MsgBox(CStr(findElement(Of Integer)(integerArray, integerSearch)))
    MsgBox(CStr(findElement(Of Date)(dateArray, dateSearch)))
End Sub

Panggilan sebelumnya ke MsgBox masing-masing menampilkan "0", "1", dan "-1".

Lihat juga