Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

C# Abstract Class

Bu yazımda C#’ta Abstract sınıfından bahsedeceğim.OOP önemli kavramlarından birini teşkil etmektedir.Şimdi gelin bu yapıyı inceleyelim.

Öncelikle abstract kavramının ve abstract sınıfların temel özelliklerinden bahsetmek istiyorum.

  • Bir Base Classta var olan metod ya da propertynin işleyişi,kalıtım alan sınıflarda ihtiyaca göre değiştirilmesi gereken durumlarda kullanılır.
  • abstract : Bu sınıf içinde abstract ile işaretlenen metodlar ve propertyler bu sınıftan kalıtım alan her sınıfta yazılmak ve implement(uygulanmak) zorundadırlar.
  • abstract metod ya da propertylerin gövdeleri tanımlandıkları class içinde yazılmazlar.Sadece imza dediğimiz geri dönüş tipleri,isimleri ve erişim belirleyicileri tanımlanabilir.Gövdeleri kalıtım alan sınıfta override edilerek yazılır.
  • abstract elemanlar private OLAMAZLAR.
  • İçimde herhangi bir abstract yapı olan classın kendisi de abstract olmak zorundadır.
  • abstract olan bir classın içinde abstract olmayan yapılar da bulunabilir.
  • abstract classlardan nesne yaratılamaz.

Şimdi örnek bir,”Calisma1″ adında, abstract sınıf oluşturalım.

---Calisma1.cs---
    abstract class Calisma1
    {
    }

Şimdide abstract sınıfta ne tür metodlar ve propertyler yazılabiliyormuş görelim.

---Calisma1.cs---
    abstract class Calisma1
    {
        public void Deneme()
        { }
//abstract olmayan metodlar yazılabilir.
        public abstract void Deneme2();
/*abstract olan metodlar yazılabilir.Ancak dikkat edilmesi gereken bir nokta,
abstract metodların scopeları bu sınıfta yazılmaması gerekiyor.Kalıtım alacağı
sınıfta override edilerek bu gövdeleri oluşturulacaktır.*/
        public string Deneme3 { get; set; }
//abstract olmayan propertyler yazılabilir.
        public abstract int Deneme4 { get; set; }
//abstract propertyler yazılabilir.
    }

Şimdi yukarıda oluşturduğumuz “Calisma1” sınıfından iki kalıtım alan sınıf yapalım.Bunların adları “Calisma2” ve “Calisma3” olsun.

---Calisma2.cs---
    class Calisma2 : Calisma1
    {

    }

 

---Calisma3.cs---
    class Calisma3 : Calisma1
    {

    }

Yukarıda gördüğünüz “Calisma2” ve “Calisma3” sınıfları “Calisma1” sınıfından kalıtım alıyorlar.Eğer bu halde programı derlersek hata alacağız.Yukarıdaki kuralları hatırlarsanız,abstract olarak tanımlı olan sınıfta abstract ifadeler varsa eğer, o sınıftan kalıtım alan classlarda yazılmak ve implement(uygulanmak) zorundadırlar.Şimdi öncelikle “Calisma2” sınıfında,Base Classtaki abstract ifadeli metod ya da propertyleri implement edelim.

---Calisma2.cs---
    class Calisma2 : Calisma1
    {
        public override void Deneme2()
        {
            MessageBox.Show("Test");
        }
        int deger;
        public override int Deneme4
        {
            get
            {
                return deger;
            }
            set
            {
                deger = value;
            }
        }
    }

Yukarıda gördüğünüz gibi override yaparak Base Classtaki abstract ifadeli metod ve propertyleri bu sınıfta tanımladım.Bu şekilde programı derlediğimiz zaman,”Calisma3″ sınıfında da bu şekilde abstract ifadeleri implement etmediğimizden alacağız.Yani vurgulamak istediğim nokta, abstract sınıfındaki abstract ifadeler, o sınıftan kalıtım alan bütün sınıflarda implement etmek zorundayız.

---Calisma3.cs---
    class Calisma3 : Calisma1
    {
        public override void Deneme2()
        {
            MessageBox.Show("Test");
        }
        int deger;
        public override int Deneme4
        {
            get
            {
                return deger;
            }
            set
            {
                deger = value;
            }
        }
    }

Artık “Calisma3” sınıfında da Base Classındaki abstract ifadeler implement edildi.Bu şekilde programımızı derlersek hiç bir hatayla karşılaşmayacağız.


Dikkat !!! abstract sınıflardan nesne üretemiyoruz.Ama o sınıftan referans noktası oluşturabiliyoruz.

Bunlar da hoşunuza gidebilir...

3 Cevaplar

  1. msbr dedi ki:

    Hocam, nesneyi modellemek için Abstract Class’ı kullanabilir miyiz?

  2. Burcu dedi ki:

    Hocam bir sınıf, herhangi bir soyut metot olmadan da soyut hale getirilebilir mi? Kimi kaynaklar evet getirilebilir diyor, kimi getirilemez diyor? Doğrusu nedir hocam?

    • Gençay dedi ki:

      Bir sınıfın soyut hale getirilmesi için illa bir soyut metoda gerek yoktur. Misal olarak aşağıdaki abstract class’ı ele alırsak eğer içerisinde herhangi bir soyut ya da normal member tanımında bulunulmamış olsa da yine bir abstract class’tır.

      abstract class MyAbstractClass
      {
      
      }
      

      Çok sığ bir cevap vermiş olabilirim. Doğrusu sorunuzu tam anlayabildiğimi düşünmüyorum 🙂

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir