Pemrograman berorientasi objek pada VB.NET dibangun dari dua unsur dasar, yaitu kelas dan objek. Topik ini membahas sintaks pernyataan Class, peran field (field) sebagai data yang melekat pada objek, pembuatan objek dengan New, serta tingkat akses Public dan Private yang mengatur dari mana sebuah anggota boleh dipanggil. Contoh yang digunakan adalah kelas BukuResep yang dijalankan sungguhan, sehingga setiap keluaran yang ditampilkan berasal dari eksekusi nyata. Setelah membacanya, proses mendeklarasikan kelas sendiri dan membuat beberapa objek dari kelas tersebut dapat dilakukan tanpa menghafal cetakan kode.
Kelas sebagai cetak biru objek#
Kelas (class) adalah cetak biru yang mendefinisikan data dan perilaku untuk sejenis objek, sedangkan objek (object) adalah wujud dari kelas itu yang hidup ketika program berjalan. Satu kelas dapat menghasilkan banyak objek, dan setiap objek menyimpan keadaannya sendiri. Dua objek yang dibuat dari kelas yang sama tidak berbagi isi field, sehingga mengubah keadaan objek pertama tidak pernah memengaruhi objek kedua. Definisinya ditulis sekali pada kode sumber dan tidak berubah saat program berjalan, sedangkan keadaan tiap objek terus bergerak mengikuti pernyataan yang dieksekusi. Pemisahan antara definisi yang ditulis sekali dan wujud yang dibuat berkali-kali inilah yang membuat kode berorientasi objek dapat diperluas tanpa menduplikasi definisinya.
Istilah instansiasi (instantiation) digunakan untuk menyebut proses membuat objek dari kelasnya. Objek hasil instansiasi sering disebut instans (instance). Pada jalur ini, kata objek digunakan secara konsisten untuk menunjuk instans tersebut, sedangkan kata kelas merujuk pada definisinya. Perbedaan keduanya sebanding dengan perbedaan resep dan hidangan, yaitu resepnya satu, sedangkan hidangan yang dibuat darinya dapat banyak dan tiap hidangan berdiri sendiri.
Deklarasi kelas dengan anggotanya#
Deklarasi kelas dibuka dengan pernyataan Class NamaKelas dan ditutup dengan End Class. Di dalam badannya dituliskan anggota kelas, yaitu field untuk menyimpan data serta prosedur Sub dan Function untuk mendefinisikan perilaku. Tingkat akses menentukan jangkauan anggota: anggota yang diberi Public dapat dipanggil dari luar kelas, sedangkan anggota yang diberi Private hanya dapat digunakan oleh kode di dalam kelas yang sama. Kelas yang baik umumnya menyembunyikan field-nya dengan Private dan membuka pintu akses berupa metode Public, sebagaimana tampak pada kelas BukuResep berikut.
' tidak-dijalankan
Class BukuResep
Private judul As String ' field: data milik objek, tersembunyi dari luar
Private jumlahLangkah As Integer
Public Sub AturJudul(nilaiBaru As String)
judul = nilaiBaru ' kode di dalam kelas boleh menyentuh field privat
End Sub
Public Sub TampilkanInfo()
Console.WriteLine($"Resep: {judul} ({jumlahLangkah} langkah)")
End Sub
End ClassNama kelas dan anggotanya mengikuti konvensi PascalCase, sedangkan nama field privat menurut konvensi umum ditulis dengan huruf kecil di awal. Field judul pada contoh sengaja dibuat Private karena penyuntingan judul harus melewati AturJudul, sehingga aturan apa pun yang berlaku pada judul cukup ditegakkan di satu tempat. Apabila kode di luar kelas berusaha menyentuh field tersebut secara langsung, compiler menolaknya dengan pesan error, misalnya error BC30389 yang menyatakan anggota tersebut tidak dapat diakses karena sifat Private-nya.
Membuat objek dengan New#
Objek dibuat dengan operator New yang mengalokasikan objek baru lalu menjalankan inisialisasinya. Bentuk yang paling lazim adalah Dim nama As New NamaKelas(), yang sekaligus mendeklarasikan variabel dan mengisinya dengan objek baru. Setiap pernyataan New menghasilkan objek yang berdiri sendiri, sehingga dua variabel yang dibuat dari kelas yang sama menyimpan dua keadaan yang terpisah. Program utuh berikut mendemonstrasikan hal tersebut dengan dua objek BukuResep yang diisi dengan data berbeda.
Class BukuResep
Private judul As String
Private jumlahLangkah As Integer
Public Sub AturJudul(nilaiBaru As String)
judul = nilaiBaru
End Sub
Public Sub TambahLangkah(jumlah As Integer)
jumlahLangkah += jumlah
End Sub
Public Sub TampilkanInfo()
Console.WriteLine($"Resep: {judul} ({jumlahLangkah} langkah)")
End Sub
End Class
Module Program
Sub Main()
Dim resepSatu As New BukuResep()
Dim resepDua As New BukuResep()
resepSatu.AturJudul("Sambal Terong Kukus")
resepSatu.TambahLangkah(4)
resepDua.AturJudul("Es Jeruk Nipis")
resepDua.TambahLangkah(2)
resepSatu.TampilkanInfo()
resepDua.TampilkanInfo()
End Sub
End ModuleResep: Sambal Terong Kukus (4 langkah)
Resep: Es Jeruk Nipis (2 langkah)Metode TampilkanInfo hanya menuliskan satu baris kode, tetapi keluarannya berbeda untuk tiap pemanggil. Penyebabnya sederhana, yaitu metode tersebut selalu membaca field milik objek yang dipanggil. Pada pemanggilan resepSatu.TampilkanInfo(), field judul yang terbaca adalah milik resepSatu, dan begitu pula sebaliknya. Inilah makna objek sebagai wujud kelas: definisinya sama, tetapi keadaannya milik masing-masing objek.
# tidak-dijalankan
# membuat proyek console VB.NET baru bernama KelasObjek
dotnet new console -lang VB -o KelasObjek
# mengganti isi Program.vb dengan kode program di atas melalui editor
# masuk ke folder proyek
cd KelasObjek
# mengompilasi dan menjalankan program
dotnet run$ dotnet new console -lang VB -o KelasObjek
The template "Console App" was created successfully.
Processing post-creation actions...
Restoring /home/kal/my-project/build-scratch/oop__t-transkrip/KelasObjek/KelasObjek.vbproj:
Determining projects to restore...
Restored /home/kal/my-project/build-scratch/oop__t-transkrip/KelasObjek/KelasObjek.vbproj (in 71 ms).
Restore succeeded.
$ cd KelasObjek
$ dotnet run
Resep: Sambal Terong Kukus (4 langkah)
Resep: Es Jeruk Nipis (2 langkah)Prosedur pada transkrip di atas berlaku untuk seluruh contoh console pada modul ini, yaitu membuat proyek dengan dotnet new console -lang VB, menyalin isi Program.vb, lalu menjalankan dotnet run dari folder proyeknya.
Mengapa field dibuat Private#
Menyembunyikan field di balik metode Public disebut enkapsulasi (encapsulation), yaitu prinsip menjaga data objek agar hanya berubah melalui jalur yang disediakan kelasnya. Manfaat langsungnya adalah kendali: aturan pada data cukup ditulis di satu tempat, sehingga perubahan aturan tidak perlu dikejar ke seluruh kode pemanggil. Kelas yang anggota internalnya tersembunyi juga lebih mudah disunting, karena bagian dalamnya dapat dirombak tanpa memengaruhi kode yang menggunakannya, selama pintu akses Public-nya tetap sama.
VB.NET menyediakan konstruk khusus bernama prosedur Property untuk kebutuhan akses terkendali semacam ini, yaitu anggota dengan blok Get dan Set yang dapat memuat validasi. Pada topik ini, pintu akses cukup dibentuk dari metode biasa, sedangkan prosedur Property menyediakan bentuk yang lebih ringkas untuk kebutuhan yang sama. Apa pun bentuk pintunya, prinsipnya tetap sama, yaitu data disimpan dalam field Private dan disentuh dari luar hanya melalui anggota Public.
Konvensi ini juga mengurangi titik kegagalan ketika program bertambah besar. Kode yang menyentuh field secara langsung terikat pada detail internal kelasnya, sehingga mengganti struktur data internal berarti menyunting seluruh titik akses tersebut. Dengan pintu akses yang dibatasi, penyuntingan internal cukup dilakukan pada satu atau beberapa metode milik kelas itu sendiri, dan kode pemanggil tidak pernah ikut berubah.
Kesalahan umum#
Kesalahan pertama adalah mengakses field Private dari luar kelasnya, misalnya menuliskan b.judul = "Sate Lilit". Compiler menolaknya dengan error BC30389 karena anggota tersebut memang tidak terbuka untuk kode luar, dan perbaikannya adalah memanggil metode Public yang disediakan kelas, seperti AturJudul. Apabila akses langsung memang dikehendaki, tingkat akses fieldnya perlu diubah, tetapi keputusan itu perlu dipertimbangkan ulang karena menyimpang dari prinsip enkapsulasi.
Kesalahan kedua adalah menggunakan variabel kelas tanpa pernah membuat objeknya dengan New. Variabel seperti itu bernilai Nothing, dan pemanggilan metode pada nilai Nothing memunculkan NullReferenceException ketika program berjalan. Perbaikannya adalah memastikan setiap variabel kelas diisi dengan hasil New sebelum digunakan, sebagaimana pola Dim resep As New BukuResep() pada contoh.
Kesalahan ketiga adalah menganggap keadaan dua objek saling terhubung karena berasal dari kelas yang sama. Setelah resepSatu diubah, resepDua tetap memuat nilai lamanya karena kedua objek menyimpan field masing-masing. Keliru paham semacam ini biasanya muncul saat kelas disamakan dengan variabel biasa, padahal satu kelas dapat memuat banyak keadaan yang sejajar dalam satu program.
Ringkasan#
- Kelas adalah cetak biru yang mendefinisikan field dan metode, sedangkan objek adalah wujudnya yang dibuat dengan
Newdan menyimpan keadaannya sendiri. - Anggota
Publicdapat dipanggil dari luar kelas, sedangkan anggotaPrivatehanya dapat digunakan di dalam kelas yang sama, dan field umumnya dibuatPrivatedemi enkapsulasi. - Setiap pernyataan
Newmenghasilkan objek yang berdiri sendiri, sehingga perubahan pada satu objek tidak pernah memengaruhi objek lain dari kelas yang sama.
Referensi#
- Objects and classes in Visual Basic — Microsoft Learn — Ikhtisar hubungan kelas dan objek beserta anggota kelasnya.
- Walkthrough: Defining Classes — Microsoft Learn — Langkah mendefinisikan kelas, field, dan prosedurnya.
- Class Statement — Microsoft Learn
— Sintaks
Class, tingkat akses, dan aturan anggota kelas. - New Operator — Microsoft Learn
— Operator
Newuntuk membuat objek dari sebuah kelas.