Aracılığıyla paylaş


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ı tempbir Public 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 başvurular temp değişkene erişmektedir Public . 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 perişildiğinde üye değişkenini temp gölgeler. Ancak anahtar MyClass sözcüğü gölgelendirmeyi atlar ve üye değişkenine erişir.

Graphic that shows shadowing through scope.

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 bdevralan türetilmiş bir sınıf d gösterilmektedir. Temel sınıf adlı procbir 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.

Graphic diagram of shadowing through inheritance

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 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 Private yordam ile gölgelerdisplay. içinde modül callDisplay çağrıları secondClassdisplay 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 Publicbildirirdisplay, 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 .

Ayrıca bkz.