Bagikan melalui


Prosedur Generik di Visual Basic

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

Prosedur tidak menjadi generik hanya karena didefinisikan di dalam kelas atau struktur generik. Agar generik, prosedur harus mengambil setidaknya satu parameter jenis, selain parameter normal lainnya yang mungkin dibutuhkan. Kelas atau struktur generik dapat berisi prosedur nongenerik, dan kelas, struktur, atau modul nongenerik dapat berisi prosedur generik.

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

Inferensi Jenis

Anda dapat memanggil prosedur generik tanpa menyediakan argumen jenis apa pun sama sekali. Jika Anda menyebutnya dengan cara ini, pengkompilasi mencoba menentukan jenis data yang sesuai untuk diteruskan ke argumen jenis prosedur. Ini disebut inferensi jenis. Kode berikut menunjukkan sebuah panggilan di mana pengkompilasi menyimpulkan bahwa ia 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 argumen jenis dari konteks panggilan Anda, ia melaporkan kesalahan. Salah satu kemungkinan penyebab kesalahan tersebut adalah ketidakcocokan peringkat array. Misalnya, Anda menetapkan parameter normal sebagai array dengan jenis parameter tertentu. Jika Anda memanggil prosedur generik yang menyediakan array peringkat yang berbeda (jumlah dimensi), ketidakcocokan menyebabkan inferensi jenis gagal. 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 hanya dapat memanggil inferensi jenis dengan menghilangkan semua argumen jenis. Jika Anda menyediakan satu argumen jenis, Anda harus menyediakan semuanya.

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

Contoh

Deskripsi

Contoh berikut mendefinisikan prosedur generik Function untuk menemukan elemen tertentu dalam array. 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, ia membatasi jenis parameter T untuk mengimplementasikan antarmuka IComparable<T>. Kode menggunakan metode CompareTo alih-alih operator =, karena tidak ada jaminan bahwa argumen jenis yang disediakan untuk T mendukung operator =.

Anda dapat menguji findElement prosedur 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 untuk MsgBox menampilkan masing-masing "0", "1", dan "-1".

Lihat juga