20 Aralık 2011 Salı

C# sealed Anahtar Sözcüğü

Nesne yönelimli programlamanın temel felsefelerinden biri de kalıtımdır. Konu ile ilgili detayları şuradan inceleyebilirsiniz. sealed, sınıflara ve üyelere(metot ve property) uygulanabilen bir anahtar sözcüktür. Anlamı; kapalı, mühürlü şeklinde çevirilebilir. Sınıflar için kalıtımı, üyeler için ise override edilmeyi önler. Basit örnekler üzerinden inceleme yapalım.

Birbirinden türetilen A,B ve C sınıfları olsun.

class Program : C

    {

        static void Main(string[] args)

        {

 

        }

    }

  

    public class A

    {

        public string AProperty { get; set; }

    }

 

    public class B : A

    {

        public string BProperty { get; set; }

 

    }

 

    public class C : B

    {

        public string CProperty { get; set; }

    }

Main metodu içerisinde Program tipinden bir nesne örneklediğimizde, Program sınıfının C sınıfından kalıtılması sebebiyle ilgili property’lere erişebildiğimizi görürüz. Zaten kalıtımın temel mantıklarından biri de buydu.

image

Projeyi yukarıdaki hali ile derlediğimizde herhangi bir hata almayacağız. Şimdi de amacımız, C sınıfından yapılacak bir kalıtımı önlemek. Bunun için C sınıfına sealed anahtar sözcüğünü uygulamamız yeterli olacaktır.

public sealed class C : B

    {

        public string CProperty { get; set; }

    }

sealed ile, C sınıfından herhangi bir kalıtım yapılması halinde derleme zamanı hatası alınmasını sağladık. Son hali ile projemizi derlediğimizde aşağıdaki gibi bir hata mesajı ile karşılaşacağız.

'sealedKeyword.Program': cannot derive from sealed type 'sealedKeyword.C'

Program sınıfının, sealed olarak işaretlenmiş olan C sınıfından kalıtamayacağı mesajı aldık. Dolayısı ile artık C sınıfından kalıtım yapamayacağız.

Şimdi de A sınıfı içerisine virtual bir metot ekleyelim. Daha sonra da B sınıfında bu metodu override edelim.

public class A

  {

      public virtual void Test()

      {

          Console.WriteLine("A sınıfındaki Test metodu çalıştı");

      }

  }

 

public class B : A

  {

      public override void Test()

      {

          Console.WriteLine("B sınıfındaki Test metodu çalıştı");

      }

  }

Program sınıfını B sınıfından kalıtalım ve Test metodunu override etmeye çalışalım.

image

Görüldüğü gibi Test metodu da override edilebilir bir metot olarak karşımıza çıktı.

class Program : B

    {

        public override void Test()

        {

            Console.WriteLine("Program sınıfındaki Test metodu çalıştı");

        }

 

        static void Main(string[] args)

        {

 

        }

    }

Programı derlediğimizde hata ile karşılaşmayacağız. Şimdi de B sınıfına giderek Test metodumuzu sealed olarak işaretleyelim.

public class A

  {

      public virtual void Test()

      {

          Console.WriteLine("A sınıfındaki Test metodu çalıştı");

      }

  }

 

public class B : A

  {

      public sealed override void Test()

      {

          Console.WriteLine("B sınıfındaki Test metodu çalıştı");

      }

  }

Tekrar program sınıfına dönelim ve Test metodunu override etmeyi deneyelim.

image

Artık override edilebilecek üyeler listesinde Test metodunu göremeyeceğiz. Sebebi, sealed ile işaretlenmiş olması, yani artık override edilemeyecek olmasıdır. Derleyiciden yardım almayarak manuel olarak override ettiğimizde ise derleyici tarafından bir hata mesajı alacağız.

class Program : B

    {

        public override void Test()

        {

            Console.WriteLine("Program sınıfındaki Test metodu çalıştı");

        }

 

        static void Main(string[] args)

        {

 

        }

    }

Programı derlediğimizde alacağımız hata mesajı aşağıdaki gibi olacaktır.

'sealedKeyword.Program.Test()': cannot override inherited member 'sealedKeyword.B.Test()' because it is sealed

Framework içerisinden örnek vermek gerekirse; string tipi de sealed olarak işaretlenmiştir. Yani string tipinden kalıtım yapamayız.

Untitled



8 yorum:

Adsız dedi ki...

Arkdaşım deneyimlerini bizimle paylaştığın için teşekkürler. Soyle bi sorum olacak süreklii update delete select işlemleri için fonkisyonn yazıyoruzz. Amacım şu örneğin bi fonkisyona bir entity vererek ve gerekli alanaları yazıp update etmek istiyomm. Yada sen nasıl bi yol izliyon bu konuda.

Onur Salkaya dedi ki...

Teşekkür ediyorum. Bahsettiğiniz işlemle ilgili entity framework kullanmanızı öneririm. Arşivde bu konu ile ilgili başlıklar mevcut. Sırası ile aşağıdaki iki makaleyi okumanızı tavsiye ederim.

1)http://onursalkaya.blogspot.com/2011/11/image.html

2)http://onursalkaya.blogspot.com/2011/11/bir-onceki-makalemizde-bir-veritaban.html

NUMAN HOCA dedi ki...

Amaca yönelik bir blog olmuş tebrikler

MATEMATİK KORKUSUNA SON

Unknown dedi ki...

vermiş olduğunuz bilgi ve örneklemeler için seo ekibi adına teşekkürlerimi sunuyorum.

mustafa dedi ki...

Biz de faydalandık. teşekkürler asya seo adına...

selma dedi ki...

Teşekkürler faydalı bilgi için. Entity frameword tavsiye ederim bende. Saygılarla ege cam balkon ekibi adına selma

IPv6 SSD Sunucu dedi ki...

Hocam C# Nekadar sürede profosyonel bir biçimde öğrenebilirim?

Semih dedi ki...

Güzel anlatım, teşekkürler.

Yorum Gönder