Bagikan melalui


Jenis Generik dalam Visual Basic (Visual Basic)

Jenis generik adalah elemen pemrograman tunggal yang beradaptasi untuk melakukan fungsionalitas yang sama untuk beragam jenis data. Ketika menentukan kelas atau prosedur generik, Anda tidak harus menentukan versi terpisah untuk setiap jenis data yang mungkin fungsionalitasnya ingin Anda lakukan.

Analoginya adalah set obeng dengan kepala yang dapat dilepas. Anda memeriksa sekrup yang harus Anda putar dan memilih kepala yang tepat untuk sekrup itu (minus, plus, bintang). Setelah memasukkan kepala yang benar ke handel obeng, Anda melakukan fungsi yang sama persis dengan obeng, yaitu memutar sekrup.

Diagram of a screwdriver set with different heads.

Ketika menentukan jenis generik, Anda memparameterkannya dengan satu atau beberapa jenis data. Ini memungkinkan penggunaan kode untuk menyesuaikan jenis data dengan persyaratannya. Kode Anda dapat menyatakan beberapa elemen pemrograman yang berbeda dari elemen generik, dengan masing-masing bertindak pada berbagai set jenis data. Tetapi elemen yang dinyatakan semuanya melakukan logika yang identik, tidak peduli apa pun jenis data yang digunakan.

Misalnya, Anda mungkin ingin membuat dan menggunakan kelas antrean yang beroperasi pada jenis data tertentu seperti String. Anda dapat menyatakan kelas seperti itu dari System.Collections.Generic.Queue<T>, seperti yang ditunjukkan contoh berikut.

Public stringQ As New System.Collections.Generic.Queue(Of String)

Anda sekarang dapat menggunakan stringQ untuk menggunakan secara eksklusif nilai String. Karena stringQyang khusus untuk String tidak digeneralisasi untuk nilai Object, Anda tidak memiliki pengikatan terakhir atau konversi jenis. Ini menghemat waktu eksekusi dan mengurangi kesalahan run-time.

Untuk informasi selengkapnya tentang menggunakan jenis generik, lihat Cara: Menggunakan Kelas Generik.

Contoh Kelas Generik

Contoh berikut menunjukkan definisi kerangka kelas generik.

Public Class classHolder(Of t)
    Public Sub processNewItem(ByVal newItem As t)
        Dim tempItem As t
        ' Insert code that processes an item of data type t.
    End Sub
End Class

Dalam kerangka sebelumnya, t adalah parameter jenis, yaitu tempat penampung untuk jenis data yang Anda berikan saat menyatakan kelas. Di tempat lain dalam kode Anda, Anda dapat menyatakan beragam versi classHolder dengan menyediakan beragam jenis data untuk t. Contoh berikut menunjukkan dua deklarasi tersebut.

Public integerClass As New classHolder(Of Integer)
Friend stringClass As New classHolder(Of String)

Pernyataan sebelumnya menyatakan kelas yang dibangun, di mana jenis tertentu menggantikan parameter jenis. Penggantian ini disebarkan ke seluruh kode dalam kelas yang dibangun. Contoh berikut menunjukkan seperti apa prosedur processNewItem tersebut dalam integerClass.

Public Sub processNewItem(ByVal newItem As Integer)
    Dim tempItem As Integer
    ' Inserted code now processes an Integer item.
End Sub

Pelajari selengkapnya tentang: Cara: Menentukan Kelas yang Dapat Menyediakan Fungsionalitas Identik pada Berbagai Jenis Data.

Elemen Pemrograman yang Memenuhi Syarat

Anda dapat menentukan dan menggunakan kelas, struktur, antarmuka, prosedur, dan delegasi generik. Perhatikan bahwa .NET Framework menentukan beberapa kelas, struktur, dan antarmuka generik yang mewakili elemen generik yang umum digunakan. Namespace System.Collections.Generic menyediakan kamus, daftar, antrean, dan tumpukan. Sebelum menentukan elemen generik Anda sendiri, lihat apakah ia sudah tersedia dalam System.Collections.Generic.

Prosedur bukan jenis, tetapi Anda dapat menentukan dan menggunakan prosedur generik. Lihat Prosedur Generik dalam Visual Basic.

Keuntungan dari Jenis Generik

Jenis generik berfungsi sebagai dasar untuk menyatakan beberapa elemen pemrograman yang berbeda, yang masing-masing beroperasi pada jenis data tertentu. Alternatif untuk jenis generik adalah:

  1. Satu jenis yang beroperasi pada jenis data Object.

  2. Set versi jenis tertentu, yang setiap versi dikodekan secara individual dan beroperasi pada satu jenis data tertentu seperti String, Integer, atau jenis yang ditentukan pengguna seperti customer.

Jenis generik memiliki keuntungan berikut dibandingkan alternatif ini:

  • Keamanan Jenis. Jenis generik memberlakukan pemeriksaan jenis waktu kompilasi. Jenis berdasarkan Object menerima jenis data apa pun, dan Anda harus menulis kode untuk memeriksa apakah jenis data input dapat diterima. Dengan jenis generik, pengompilasi dapat menangkap ketidakcocokan jenis sebelum run time.

  • Performa. Jenis generik tidak harus mengotak dan membongkar data, karena masing-masing dikhususkan untuk satu jenis data. Operasi berdasarkan Object harus mengotakkan jenis data input untuk dikonversi ke Object dan membongkar data yang ditujukan untuk keluaran. Pengotakan dan pembongkaran mengurangi performa.

    Jenis berdasarkan Object juga berupa ikatan terlambat, yang berarti bahwa pengaksesan anggotanya memerlukan kode tambahan pada run time. Ini juga mengurangi performa.

  • Konsolidasi Kode. Kode dalam jenis generik harus hanya ditentukan sekali. Set versi jenis tertentu dari jenis harus mereplikasi kode yang sama dalam setiap versi, dengan satu-satunya perbedaan adalah jenis data tertentu untuk versi tersebut. Dengan jenis generik, semua versi jenis tertentu dihasilkan dari jenis generik asli.

  • Penggunaan Kembali Kode. Kode yang tidak bergantung pada jenis data tertentu dapat digunakan kembali dengan beragam jenis data jika bersifat generik. Anda dapat sering menggunakannya kembali meski dengan jenis data yang awalnya tidak Anda prediksi.

  • Dukungan IDE. Ketika Anda menggunakan jenis yang dibangun yang dinyatakan dari jenis generik, lingkungan pengembangan terintegrasi (IDE) dapat memberi Anda lebih banyak dukungan saat Anda mengembangkan kode. Misalnya, IntelliSense dapat menunjukkan opsi jenis tertentu untuk argumen ke konstruktor atau metode.

  • Algoritma Generik. Algoritma abstrak yang bersifat jenis mandiri adalah kandidat yang baik untuk jenis generik. Misalnya, prosedur generik yang mengurutkan item menggunakan antarmuka IComparable dapat digunakan dengan jenis data apa pun yang menerapkan IComparable.

Kendala

Meski kode dalam definisi jenis generik harus sebisa mungkin berupa jenis mandiri, Anda mungkin perlu mengharuskan kemampuan tertentu dari jenis data apa pun yang disediakan untuk jenis generik Anda. Misalnya, jika Anda ingin membandingkan dua item untuk tujuan pengurutan atau penyusunan, jenis datanya harus menerapkan antarmuka IComparable. Anda dapat memberlakukan persyaratan ini dengan menambahkan batasan ke parameter jenis.

Contoh Batasan

Contoh berikut menunjukkan definisi kerangka kelas dengan batasan yang memerlukan argumen jenis untuk menerapkan IComparable.

Public Class itemManager(Of t As IComparable)
    ' Insert code that defines class members.
End Class

Jika kode berikutnya berupaya membangun kelas dari itemManager yang menyediakan jenis yang tidak menerapkan IComparable, pengompilasi memberi sinyal kesalahan.

Jenis Batasan

Anda dapat menentukan persyaratan berikut dalam kombinasi apa pun:

  • Argumen jenis harus menerapkan satu atau beberapa antarmuka

  • Argumen jenis harus berjenis, atau diwarisi dari, paling banyak satu kelas

  • Argumen jenis harus memaparkan konstruktor tanpa parameter yang dapat diakses oleh kode yang membuat objek darinya

  • Argumen jenis harus berupa jenis referensi, atau harus berupa jenis nilai

Jika perlu memberlakukan lebih dari satu persyaratan, Anda menggunakan daftar batasan yang dipisahkan koma di dalam kurung kurawal ({ }). Untuk mengharuskan konstruktor yang dapat diakses, Anda menyertakan kata kunci Operator Baru dalam daftar. Untuk mengharuskan jenis referensi, Anda menyertakan kata kunci Class; untuk mengharuskan jenis nilai, Anda menyertakan kata kunci Structure.

Untuk informasi selengkapnya tentang batasan, lihat Daftar Jenis.

Contoh Beberapa Batasan

Contoh berikut menunjukkan definisi kerangka kelas generik dengan daftar batasan pada parameter jenis. Dalam kode yang membuat instans kelas ini, argumen jenis harus menerapkan antarmuka IComparable maupun IDisposable, menjadi jenis referensi, dan memaparkan konstruktor tanpa parameter yang dapat diakses.

Public Class thisClass(Of t As {IComparable, IDisposable, Class, New})
    ' Insert code that defines class members.
End Class

Istilah Penting

Jenis generik memperkenalkan dan menggunakan istilah berikut:

  • Jenis Generik. Definisi kelas, struktur, antarmuka, prosedur, atau delegasi yang Anda berikan setidaknya satu jenis data saat Anda menyatakannya.

  • Parameter Jenis. Dalam definisi jenis generik, tempat penampung untuk jenis data yang Anda berikan saat Anda menyatakan jenisnya.

  • Argumen Jenis. Jenis data tertentu yang menggantikan parameter jenis saat Anda menyatakan jenis yang dibangun dari jenis generik.

  • Batasan. Kondisi pada parameter jenis yang membatasi argumen jenis yang dapat Anda berikan untuknya. Batasan dapat mengharuskan bahwa argumen jenis harus menerapkan antarmuka tertentu, menjadi atau mewarisi dari kelas tertentu, memiliki konstruktor tanpa parameter yang dapat diakses, atau menjadi jenis referensi atau jenis nilai. Anda dapat menggabungkan batasan ini, tetapi Anda dapat menentukan paling banyak satu kelas.

  • Jenis Yang Dibangun. Kelas, struktur, antarmuka, prosedur, atau delegasi yang dinyatakan dari jenis generik dengan menyediakan argumen jenis untuk parameter jenisnya.

Lihat juga