Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Ketika dua elemen pemrograman memiliki nama yang sama, salah satunya dapat menyembunyikan, atau membayangi, elemen lainnya. Dalam situasi seperti itu, elemen bayangan tidak tersedia untuk referensi; sebagai gantinya, ketika kode Anda menggunakan nama elemen, pengkompilasi Visual Basic menyelesaikannya ke elemen bayangan.
Tujuan
Tujuan utama bayangan adalah untuk melindungi definisi anggota kelas Anda. Kelas dasar mungkin mengalami perubahan yang membuat elemen dengan nama yang sama dengan yang telah Anda tentukan. Jika ini terjadi, modifier Shadows memaksa referensi dalam kelas Anda untuk diarahkan pada anggota yang Anda tentukan, bukan pada elemen kelas dasar yang baru.
Jenis Bayangan
Elemen dapat membayangi elemen lain dengan dua cara yang berbeda. Elemen bayangan dapat dideklarasikan di dalam subregsi wilayah yang berisi elemen berbayang, dalam hal ini bayangan dicapai melalui cakupan. Atau kelas turunan dapat menentukan ulang anggota kelas dasar, dalam hal ini bayangan dilakukan melalui pewarisan.
Pengamatan Bayangan Melalui Perspektif
Dimungkinkan untuk elemen pemrograman dalam modul, kelas, atau struktur yang sama untuk memiliki nama yang sama tetapi cakupan yang berbeda. Ketika dua elemen dideklarasikan dengan cara ini dan kode mengacu pada nama yang mereka bagikan, elemen dengan cakupan yang lebih sempit membayangi elemen lain (cakupan blok adalah yang paling sempit).
Misalnya, modul dapat menentukan Public variabel bernama temp, dan prosedur dalam modul dapat mendeklarasikan variabel lokal yang juga bernama temp. Referensi ke temp dari dalam prosedur mengakses variabel lokal, sementara referensi ke temp dari luar prosedur mengakses Public variabel. Dalam hal ini, variabel prosedur temp membayangi variabel modul temp.
Ilustrasi berikut menunjukkan dua variabel, keduanya bernama temp. Variabel lokal temp mengaburkan variabel anggota temp ketika diakses dari dalam prosedurnya sendiri p. Namun, MyClass kata kunci melewati bayangan dan mengakses variabel anggota.
Untuk contoh penyembunyian melalui cakupan, silakan lihat Cara: Menyembunyikan variabel dengan nama yang sama dengan variabel Anda.
Bayangan Melalui Warisan
Jika kelas turunan mendefinisikan ulang elemen pemrograman yang diwarisi dari kelas dasar, elemen pendefinisian ulang membayangi elemen asli. Anda dapat menyamarkan setiap jenis elemen yang dideklarasikan, atau sekumpulan elemen yang mengalami overloading, dengan jenis lain. Misalnya, variabel Integer dapat menutupi prosedur Function. Jika Anda menggabungkan sebuah prosedur dengan prosedur lain, Anda dapat menggunakan daftar parameter yang berbeda dan tipe pengembalian yang berbeda.
Ilustrasi berikut menunjukkan kelas b dasar dan kelas d turunan yang mewarisi dari b. Kelas dasar mendefinisikan prosedur bernama proc, dan kelas turunan membayanginya dengan prosedur lain dengan nama yang sama. Pernyataan pertama Call mengakses variabel yang dibayangi proc di kelas turunan. Namun, MyBase kata kunci melewati bayangan dan mengakses prosedur berbayang di kelas dasar.
Untuk contoh bayangan melalui pewarisan, lihat Cara: Menyembunyikan Variabel dengan Nama yang Sama dengan Variabel Anda dan Cara: Menyembunyikan Variabel yang Diwariskan.
Tingkat Bayangan dan Akses
Elemen bayangan tidak selalu dapat diakses dari kode menggunakan kelas turunan. Misalnya, mungkin dinyatakan Private. Dalam kasus seperti itu, bayangan dikalahkan dan pengkompilasi menyelesaikan referensi apa pun ke elemen yang sama yang akan dimilikinya jika tidak ada bayangan. Elemen ini adalah elemen yang paling cepat diakses dengan paling sedikit langkah derivasi mundur dari kelas bayangan. Jika elemen bayangan adalah prosedur, resolusinya adalah ke versi terdekat yang dapat diakses dengan nama, daftar parameter, dan jenis pengembalian yang sama.
Contoh berikut menunjukkan hierarki warisan dari tiga kelas. Setiap kelas mendefinisikan prosedur Sub, dan setiap kelas turunan menggantikan prosedur display di kelas dasarnya.
Public Class firstClass
Public Sub display()
MsgBox("This is firstClass")
End Sub
End Class
Public Class secondClass
Inherits firstClass
Private Shadows Sub display()
MsgBox("This is secondClass")
End Sub
End Class
Public Class thirdClass
Inherits secondClass
Public Shadows Sub display()
MsgBox("This is thirdClass")
End Sub
End Class
Module callDisplay
Dim first As New firstClass
Dim second As New secondClass
Dim third As New thirdClass
Public Sub callDisplayProcedures()
' The following statement displays "This is firstClass".
first.display()
' The following statement displays "This is firstClass".
second.display()
' The following statement displays "This is thirdClass".
third.display()
End Sub
End Module
Dalam contoh sebelumnya, kelas yang diturunkan menyembunyikan secondClass dengan prosedur display. Ketika modul callDisplay memanggil display dalam secondClass, kode panggilan berada di luar secondClass sehingga tidak dapat mengakses prosedur privat display. Bayangan dikalahkan, dan pengkompilasi menyelesaikan referensi ke prosedur kelas display dasar.
Namun, kelas thirdClass turunan lebih lanjut menyatakan display sebagai Public, sehingga kode di callDisplay dapat mengaksesnya.
Bayangan dan Penimpaan
Jangan bingung antara shadowing dengan penimpaan. Keduanya digunakan ketika kelas turunan mewarisi dari kelas dasar, dan keduanya menentukan ulang satu elemen yang dideklarasikan dengan elemen lain. Tetapi ada perbedaan signifikan antara keduanya. Untuk perbandingan, lihat Perbedaan Antara Bayangan dan Penimpaan.
Bayangan dan Kelebihan Beban
Jika Anda membayangi elemen kelas dasar yang sama dengan lebih dari satu elemen di kelas turunan Anda, elemen bayangan menjadi versi elemen tersebut yang kelebihan beban. Untuk informasi selengkapnya, lihat Kelebihan Muatan Prosedur.
Mengakses Elemen Bayangan
Ketika Anda mengakses elemen dari kelas turunan, Anda biasanya melakukannya melalui instans kelas turunan saat ini, dengan memenuhi syarat nama elemen dengan Me kata kunci. Jika kelas turunan Anda membayangi elemen di kelas dasar, Anda dapat mengakses elemen kelas dasar dengan memenuhi syarat dengan MyBase kata kunci.
Untuk contoh mengakses elemen bayangan, lihat Cara: Mengakses Variabel yang Disembunyikan oleh Kelas Turunan.
Deklarasi Variabel Objek
Cara Anda membuat variabel objek juga dapat memengaruhi apakah kelas turunan mengakses elemen bayangan atau elemen yang dibayangi. Contoh berikut membuat dua objek dari kelas turunan, tetapi satu objek dinyatakan sebagai kelas dasar dan yang lainnya sebagai kelas turunan.
Public Class baseCls
' The following statement declares the element that is to be shadowed.
Public z As Integer = 100
End Class
Public Class dervCls
Inherits baseCls
' The following statement declares the shadowing element.
Public Shadows z As String = "*"
End Class
Public Class useClasses
' The following statement creates the object declared as the base class.
Dim basObj As baseCls = New dervCls()
' Note that dervCls widens to its base class baseCls.
' The following statement creates the object declared as the derived class.
Dim derObj As dervCls = New dervCls()
Public Sub showZ()
' The following statement outputs 100 (the shadowed element).
MsgBox("Accessed through base class: " & basObj.z)
' The following statement outputs "*" (the shadowing element).
MsgBox("Accessed through derived class: " & derObj.z)
End Sub
End Class
Dalam contoh sebelumnya, variabel basObj dinyatakan sebagai kelas dasar. Menyematkan objek dervCls menghasilkan konversi yang melebar dan karenanya valid. Namun, kelas dasar tidak dapat mengakses versi bayangan variabel z di kelas turunan, sehingga pengkompilasi menyelesaikan basObj.z ke nilai kelas dasar asli.