Visual Basic'de Gölgeleme
İki programlama öğesi aynı adı paylaştığında, bunlardan biri diğerini gizleyebilir veya gölgeleyebilir. Böyle bir durumda, gölgeli öğe başvuru için kullanılamaz; bunun yerine, kodunuz öğe adını kullandığında, Visual Basic derleyicisi bunu gölgelendirme öğesine çözümler.
Purpose
Gölgelendirmenin temel amacı, sınıf üyelerinizin tanımını korumaktır. Temel sınıf, önceden tanımladığınız adla aynı ada sahip bir öğe oluşturan bir değişikliğe uğrayabilir. Bu durumda değiştirici, Shadows
sınıfınız üzerinden başvuruların yeni temel sınıf öğesi yerine tanımladığınız üyeye çözümlenmesine zorlar.
Gölgeleme Türleri
Bir öğe, başka bir öğeyi iki farklı yolla gölgeleyebilir. Gölgeleme öğesi, gölgeli öğeyi içeren bölgenin bir alt bölgesi içinde bildirilebilir ve bu durumda gölgelendirme kapsam aracılığıyla gerçekleştirilir. Veya türetilen bir sınıf, temel sınıfın bir üyesini yeniden tanımlayabilir ve bu durumda gölgelendirme devralma yoluyla yapılır.
Kapsam Boyunca Gölgeleme
Aynı modül, sınıf veya yapıdaki programlama öğelerinin aynı ada ama farklı bir kapsama sahip olması mümkündür. İki öğe bu şekilde bildirildiğinde ve kod paylaştıkları ada başvurduğunda, dar kapsamlı öğe diğer öğeyi gölgeler (blok kapsamı en dardır).
Örneğin, bir modül adlı temp
bir Public
değişken tanımlayabilir ve modüldeki bir yordam da adlı temp
bir yerel değişken bildirebilir. Başvurular temp
yordamın içinden yerel değişkene erişirken, yordam dışından başvurular temp
değişkene erişmektedir Public
. Bu durumda, yordam değişkeni modül değişkenini temp
temp
gölgeler.
Aşağıdaki çizimde her ikisi de adlı temp
iki değişken gösterilmektedir. Yerel değişkentemp
, kendi yordamından p
erişildiğinde üye değişkenini temp
gölgeler. Ancak anahtar MyClass
sözcüğü gölgelendirmeyi atlar ve üye değişkenine erişir.
Kapsam boyunca gölgelendirme örneği için bkz . Nasıl yapılır: Değişkeninizle Aynı Ada Sahip Bir Değişkeni Gizleme.
Devralma Yoluyla Gölgeleme
Türetilmiş bir sınıf temel sınıftan devralınan bir programlama öğesini yeniden tanımlarsa, yeniden tanımlanan öğe özgün öğeyi gölgeler. Bildirilen herhangi bir öğe türünü veya aşırı yüklenmiş öğe kümesini başka bir türle gölgeleyebilirsiniz. Örneğin, bir Integer
değişken bir Function
yordamı gölgeleyebilir. Bir yordamı başka bir yordamla gölgelerseniz, farklı bir parametre listesi ve farklı bir dönüş türü kullanabilirsiniz.
Aşağıdaki çizimde bir temel sınıf b
ve öğesinden b
devralan türetilmiş bir sınıf d
gösterilmektedir. Temel sınıf adlı proc
bir yordam tanımlar ve türetilmiş sınıf aynı ada sahip başka bir yordamla bunu gölgeler. İlk Call
deyim türetilmiş sınıftaki gölgelendirmeye proc
erişir. Ancak anahtar sözcüğü gölgelendirmeyi MyBase
atlar ve temel sınıftaki gölgeli yordama erişir.
Devralma yoluyla gölgelendirme örneği için bkz . Nasıl yapılır: Değişkeninizle Aynı Ada Sahip Bir Değişkeni Gizleme ve Nasıl Yapılır: Devralınan Değişkeni Gizleme.
Gölgeleme ve Erişim Düzeyi
Gölgelendirme öğesine türetilmiş sınıfı kullanılarak koddan her zaman erişilemez. Örneğin, bildirilebilir Private
. Böyle bir durumda, gölgeleme yenilir ve derleyici gölgelendirme olmasaydı sahip olacağı öğeye yapılan tüm başvuruları çözümler. Bu öğe, gölgeleme sınıfından geriye doğru en az türetilmiş adım olan erişilebilir öğedir. Gölgeli öğe bir yordamsa, çözüm aynı ada, parametre listesine ve dönüş türüne sahip en yakın erişilebilir sürüme olur.
Aşağıdaki örnekte üç sınıftan oluşan bir devralma hiyerarşisi gösterilmektedir. Her sınıf bir Sub
yordam display
tanımlar ve türetilen her sınıf temel sınıfındaki yordamı gölgeler display
.
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
Yukarıdaki örnekte, türetilmiş sınıf secondClass
bir Private
yordam ile gölgelerdisplay
. içinde modül callDisplay
çağrıları secondClass
display
yapıldığında, çağıran kod dışarıdadır secondClass
ve bu nedenle özel display
yordama erişemez. Gölgeleme yenilir ve derleyici temel sınıf display
yordamına başvuruyu çözümler.
Ancak, daha fazla türetilmiş sınıf thirdClass
olarak Public
bildirirdisplay
, böylece içindeki callDisplay
kod buna erişebilir.
Gölgeleme ve Geçersiz Kılma
Gölgelendirmeyi geçersiz kılmayla karıştırmayın. Her ikisi de türetilmiş bir sınıf bir temel sınıftan devraldığında kullanılır ve her ikisi de bildirilen bir öğeyi başka bir öğeyle yeniden tanımlar. Ancak ikisi arasında önemli farklılıklar vardır. Karşılaştırma için bkz . Gölgelendirme ve Geçersiz Kılma Arasındaki Farklar.
Gölgeleme ve Aşırı Yükleme
Türetilmiş sınıfınızda birden fazla öğe ile aynı temel sınıf öğesini gölgelerseniz, gölge öğeleri bu öğenin aşırı yüklenmiş sürümlerine dönüşür. Daha fazla bilgi için bkz . Yordam Aşırı Yükleme.
Gölgeli Öğeye Erişme
Türetilmiş bir sınıftan bir öğeye eriştiğinde, bunu normalde bu türetilmiş sınıfın geçerli örneği aracılığıyla, öğe adını anahtar sözcüğüyle Me
niteleyerek yaparsınız. Türetilmiş sınıfınız temel sınıftaki öğeyi gölgelerse, temel sınıf öğesine anahtar sözcüğüyle MyBase
niteleyerek erişebilirsiniz.
Gölgeli bir öğeye erişme örneği için bkz . How to: Access a Variable Hidden by a Derived Class.
Nesne Değişkeninin Bildirimi
Nesne değişkenini oluşturma şekliniz, türetilen sınıfın bir gölge öğeye mi yoksa gölgeli öğeye mi erişdiğini de etkileyebilir. Aşağıdaki örnek türetilmiş bir sınıftan iki nesne oluşturur, ancak bir nesne temel sınıf, diğeri türetilmiş sınıf olarak bildirilir.
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
Yukarıdaki örnekte, değişken basObj
temel sınıf olarak bildirilir. dervCls
Nesneye nesne atamak bir genişletme dönüştürmesi oluşturur ve bu nedenle geçerlidir. Ancak, temel sınıf türetilmiş sınıfta değişkenin z
gölgeli sürümüne erişemez, bu nedenle derleyici özgün temel sınıf değerine çözümler basObj.z
.