Bagikan melalui


Bayangan di Visual Basic

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.

Grafik yang menunjukkan bayangan melalui teropong.

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.

Diagram grafik bayangan melalui pewarisan

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.

Lihat juga