Makale Özeti

"VB.NET biliyorum C# da öğrenmek istiyorum." diyenler için bir makale dizisi.

Makale

VB.NET 'den C#'a - 8

Shadows

Shadows ifadesi ile VB.NET'de miras aldığımız temek sınıftaki metodları gizler. Aynı isimde kendi belirlediğimiz metodları kullanabiliriz.

Public Class sekil

    Public Sub ciz(ByVal pnt As Point)

    End Sub

    Public Sub ciz(ByVal x As Integer, ByVal y As Integer)

    End Sub

End Class

Public Class kare

    Inherits sekil

    Public Shadows Sub ciz(ByVal c As Control)

    End Sub

End Class

Kullanım:

VB.NET'de shadows ifadesi ile ayını isimdeki(hide-byname) tüm metodları gizleriz.

C#'da new ifadesi ile aynı imzaya sahip (hid-bysignature) olan bir metodu gizleyebiliriz.

    public class sekil

    {

        public void ciz(Point p)

        {

            MessageBox.Show("sekil.ciz");

        }

        public void ciz(int x,int y){}

    }

    public class kare:sekil

    {

        public new void ciz(Point p)

        {

            MessageBox.Show("kare.ciz");

        }

    }

Yukarıdaki kod bloğunda new ile tanımlanan kare sınıfındeki ciz metodu sekil sınıfından miras ile aktarılan ve parametre olarak Point nesnesi alan ciz metodunu gizlemektedir. kare sınıfındaki ciz metodunda new ifadesi kullanılmadığı takdirde derleyici bir uyarı ile burada new olması gerektiğini söyleyerek uyarır ancak bu uyarıdır hata değil, new yazılmasa bile uygulama aynı şekilde derlenip çalışabilir.

Kullanımı:

            kare k=new kare();

            k.ciz(new Point(1,1));

Özetle VB.NET'de shadows ifadesi kullanılarak isme göre gizleme yapılmaktadır. Ancak C#'da new ifadesi ile yapılan gizleme ile imzaya göre gizleme yapılmatadır.

Overriding

Temel sınıfdaki bir metodun türeyen sınıfta üzerine yazılması işlemine denir. Shadows 'den farklı olarak sadece bir metodun bir overload'u override edilebilir.

VB.NET'de overriding için temel sınıfın Overridable anahtar kelimesi ile nitelendirilmesi gerekmektedir. Türeyen sınıfta ise override edebilmek için yazılan metodun Overrides olarak nitelendirilmesi gereklidir. Overridabl olarak nitelendirilmiş bir metod türeyen sınıfta override edilmek zorunda değildir. Overridable, override edilebilir anlamındadır.

Public Class sekil

    Public Overridable Sub ciz(ByVal pnt As Point)

        MessageBox.Show("sekil.ciz")

    End Sub

End Class

Public Class kare

    Inherits sekil

    Public Overrides Sub ciz(ByVal pnt As Point)

        MessageBox.Show("kare.ciz")

    End Sub

End Class

Kullanım:

        Dim k As New kare

        k.ciz(New Point(1, 1))

C#'da overriding işlemini gerçekleştirebilmek için temel sınıfdaki üyenin virtual olarak nitelendirilmiş olması gereklidir. Türeyen sınıfda override işlemini gerçekleştirebilmek için override ifadesi kullanılmalıdır.

    public class sekil

    {

        public virtual void ciz(Point pnt)

        {

            MessageBox.Show("sekil.ciz");

        }

    }

    public class kare:sekil

    {

        public override void ciz(Point pnt)

        {

            MessageBox.Show("kare.ciz");

        }

    }

Temel sınıfta yer alan bir metodun iki overloadundan sadece birisinin overridable olarak belirlenmesi ve tureyen sınıfta sadece bu overloadun override edilmesi için VB.NET'de overloads ve overrides kelimeleri beraber kullanılır.

Public Class sekil

    Public Overridable Sub ciz(ByVal pnt As Point)

        MessageBox.Show("sekil.ciz")

    End Sub

    Public Sub ciz(ByVal x As Integer, ByVal y As Integer)

        MessageBox.Show("sekil.ciz x,y")

    End Sub

End Class

Public Class kare

    Inherits sekil

    Public Overloads Overrides Sub ciz(ByVal pnt As Point)

        MessageBox.Show("kare.ciz")

    End Sub

End Class

Kullanım:

        Dim k As New kare

        k.ciz(New Point(1, 1))

        k.ciz(1, 2)

Bu kod bloğu çalıştığında arkaya arkaya iki mesaj kutusu çıkacak, birincisi kare.ciz, ikincisi ise sekil.ciz x,y metinlerini görüntüleyecektir.

C# için  aynı senaryo düşünüldüğünde overloads gibi bir anahtar kelimenin eklenmesine gerek yoktur.

    public class sekil

    {

        public virtual void ciz(Point pnt)

        {

            MessageBox.Show("sekil.ciz");

        }

        public void ciz(int x,int y)

        {

            MessageBox.Show("sekil.ciz x,y");

        }

    }

    public class kare:sekil

    {

        public override void ciz(Point pnt)

        {

            MessageBox.Show("kare.ciz");

        }

    }

NotOverridable

Tanımlanan metodlar Overridable olarak nitelendirilmediler ise NotOverridable olarak çalışırlar yani Overrides ifadesi ile override edilemezler. Ancak temel sınıfta Overridable olarak tanımlanan metodu, turetilmis olan sınıfta override ettiğimizde tureyen sınıfdan baska bir sınıf daha miras aldığında bu metod overridable olarak aktarılır.

Aşağıdaki kod bloğu bu durumu örneklemektedir.

Public Class sekil

    Public Overridable Sub ciz(ByVal pnt As Point)

        MessageBox.Show("sekil.ciz")

    End Sub

End Class

Public Class kare

    Inherits sekil

    Public Overrides Sub ciz(ByVal pnt As Point)

        MessageBox.Show("kare.ciz")

    End Sub

End Class

Public Class renklikare

    Inherits kare

    Public Overrides Sub ciz(ByVal pnt As Point)

        MessageBox.Show("renklikare.ciz")

    End Sub

End Class

sekil sınıfında overridable olarak tanımlanan ciz metodu kare sınıfına overridable olarak aktarılır, daha sonra kare sınıfından miras alan renklikare sınıfına da bu metod overridable olarak geçer ve renklikare sınıfı bu metodu override edebilir.

Eğer ciz metodunun kare sınıfından override edildikten sonra renklikare (veya kare'den miras alan başka bir sınıf) tarafından miras alınamamasını istiyorsak NotOverridable ifadesini kullanmamız gerekir.

Public Class sekil

    Public Overridable Sub ciz(ByVal pnt As Point)

        MessageBox.Show("sekil.ciz")

    End Sub

End Class

Public Class kare

    Inherits sekil

    Public NotOverridable Overrides Sub ciz(ByVal pnt As Point)

        MessageBox.Show("kare.ciz")

    End Sub

End Class

Public Class renklikare

    Inherits kare

    'Public Overrides Sub ciz(ByVal pnt As Point) 'hata verir

    '    MessageBox.Show("renklikare.ciz")

    'End Sub

End Class

Yukarıdaki kod bloğunda renklikare sınıfı ciz metodunu Overrides ile override edemeyecektir.

Aynı senaryonun C#'da uygulanması için C#'da NotOverridable yerine sealed ifadesini kullanmamız gerekir.

    public class sekil

    {

        public virtual void ciz(Point pnt)

        {

            MessageBox.Show("sekil.ciz");

        }

        public void ciz(int x,int y)

        {

            MessageBox.Show("sekil.ciz x,y");

        }

    }

    public class kare:sekil

    {

        public sealed override void ciz(Point pnt)

        {

            MessageBox.Show("kare.ciz");

        }

    }

    public class renklikare:kare

    {

//        public override void ciz(Point pnt)

//        {

//            MessageBox.Show("renklikare.ciz");

//        }

    }

Yukarıdaki kod bloğunda renklikare sınıfı miras aldığı kare sınıfındaki ciz metodunun sealed olarak nitelendirilmesi dolayısıyla ciz metodunu override ifadesi ile override edemez.

Türeyen sınıf içerisinde bir metodu override ettiğinizde halen temel sınıfdaki bir metoda erişmek isteyebilirsiniz. Bunun içn türeyen sınıf içerisinde MyBase ifadesini kullanmanız gerekir.

Public Class sekil

    Public Overridable Sub ciz(ByVal pnt As Point)

        MessageBox.Show("sekil.ciz")

    End Sub

End Class

Public Class kare

    Inherits sekil

    Public Overrides Sub ciz(ByVal pnt As Point)

        MyBase.ciz(pnt)

        MessageBox.Show("kare.ciz")

    End Sub

End Class

C# karşılığı için base anahtar kelimesi kullanmalıdır.

    public class sekil

    {

        public virtual void ciz(Point pnt)

        {

            MessageBox.Show("sekil.ciz");

        }

    }

    public class kare:sekil

    {

        public override void ciz(Point pnt)

        {

            base.ciz(pnt);

            MessageBox.Show("kare.ciz");

        }

    }

Yukarıdaki bloğuna göre kare sınıfından bir nesne oluşturup ciz metodu çağrıldığında iki mesaj kutusu görüntülenecektir, birincisi sekil.ciz, ikincisi ise kare.ciz olacaktır.

Public Class sekil

    Public Sub ciz(ByVal pnt As Point)

        Boya(pnt)

        '...

    End Sub

    Public Overridable Sub Boya(ByVal pnt As Point)

        MessageBox.Show("sekil.boya")

    End Sub

End Class

Public Class kare

    Inherits sekil

    Public Overrides Sub Boya(ByVal pnt As Point)

        MessageBox.Show("kare.boya")

    End Sub

End Class

Yukarıdaki kod bloğunda yer alan kare sınıfından bir nesne oluşturup ciz metodu çağrıldığında hem C#'da, hem VB.NET'de kare sınıfndaki Boya metodu çağrılır.

        Dim k As New kare

        k.ciz(New Point(1, 1))

Sonuç:

Ancak VB.NET'de yer alan MyClass ifadesi ile sekil sınıfındaki Boya metodu çağrılabilir. C#'da MyClass için bir karşılık yoktur.

Public Class sekil

    Public Sub ciz(ByVal pnt As Point)

        MyClass.Boya(pnt)

        '...

    End Sub

    Public Overridable Sub Boya(ByVal pnt As Point)

        MessageBox.Show("sekil.boya")

    End Sub

End Class


        Dim k As New kare

        k.ciz(New Point(1, 1))

Sonuç:

 

 

 

Cengiz HAN
Microsoft ASP.NET MVP
cengiz@cengizhan.com