Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
İ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.
Amaç
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 Alanında 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ı Publicbir temp değişken tanımlayabilir ve modüldeki bir yordam da adlı tempbir yerel değişken bildirebilir. Başvurular temp yordamın içinden yerel değişkene erişirken, yordam dışından yapılan temp başvuruları Public değişkenine erişir. Bu durumda, yordam değişkeni modül değişkenini temptempgölgeler.
Aşağıdaki çizimde her ikisi de adlı tempiki değişken gösterilmektedir. Yerel değişkentemp, kendi yordamından temperişildiğinde üye değişkenini p gölgeler. Ancak anahtar MyClass sözcüğü gölgelendirmeyi atlar ve üye değişkenine erişir.
Kapsama göre gölgelendirme örneği görmek 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 ddevralan türetilmiş bir sınıf b gösterilmektedir. Temel sınıf bir yordam proc tanımlar ve türetilmiş sınıf aynı ada sahip başka bir yordamla onu gölgeler. İlk Call ifade, türetilmiş sınıftaki gölgeleyen proc öğesine erişir. Ancak MyBase anahtar sözcüğü, gölgelendirmeyi koşulsuz atlar ve temel sınıftaki gölgelendirilmiş işleve 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 engellenir ve derleyici, gölgeleme olmasaydı erişeceği aynı öğ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 displaytanı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 display yordam ile Private gölgeler. Modül callDisplay, display'deki secondClass'yi çağırdığında, çağırma kodu secondClass dışındadır ve bu nedenle özel display yordamına 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, display öğesini Public olarak bildirir; böylece callDisplay içindeki kod buna erişebilir.
Gölgeleme ve Geçersiz Kılma
Gölgelemeyi öncelik vermeyle 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.
Örnek bir gizlenmiş öğeye erişim için, ayrıntılar için bakınız "Türetilmiş Sınıf Tarafından Gizlenen Bir Değişkene Erişme Yöntemi".
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. Bir nesneyi dervCls nesnesine atamak bir genişletici dönüşüm 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 .