Yazdığımız bir sınıftan nesne referansı alınmasını istemediğimiz, yalnızca kalıtım yoluyla türetilmesini istediğimiz zamanlarda abstract anahtar kelimesini kullanırız. Soyut (abstract) olarak tanımlanan metotların ise içi doldurulmaz. Soyut sınıftan türetilen sınıf (derived class) bu metotları implement etmek zorundadır.

C# - Abstract (Soyut) Sınıf ve Metotlar

Implement etmek, gövdesi yazılmayan metodu sınıf içinde oluşturma işlemine denir. Metot ezme işlemindeki gibi override anahtar kelimesi kullanılır. Soyut metotlar public olmak zorundadır.

Şimdi bir örnek yapalım ve bir "Taşıt" soyut sınıfı oluşturup bu sınıftan "Araba" ve "Gemi" sınıflarını türetelim.

abstract class Tasit
{
    public string Ad { get; set; }
    public int KoltukSayisi { get; set; }

    public abstract bool UygunOrtamVarMi(string ortam);

    public void Calistir(string ortam)
    {
        if(this.UygunOrtamVarMi(ortam))
        {
            Console.WriteLine("Çalıştırıyorum...");
        }
        else
        {
            Console.WriteLine("Malesef, " + ortam + " ortamında çalışamaz... :(");
        }
    }
}

Yukarıda gördüğünüz üzere sınıf özelliklerini tanımlarken bir değişiklik yok fakat metot tanımlarken gövdesini yazmadım ve türetilen sınıf içerisinde yazılmasını istedim. Soyut sınıfları kelime anlamı ile düşünebilirsiniz. Taşıt bir varlıktır fakat tek başına bir anlam ifade etmez. Ancak tüm taşıtlar (araba, gemi, uçak vb.) için ortak özellikleri belirler.

Çalıştır metodunda UygunOrtamVarMi metoduna giderek sağlanıp sağlanmadığına bakıyor ve kullanıcıya bir mesaj veriyoruz.

Örneğin, "Ankara'ya ne ile gidiyorsun" denildiğinde "Taşıtla :))" diyemeyeceğimiz gibi Tasit tasit = new Tasit(); gibi bir tanımlama da yapamayız. Eğer denerseniz "Cannot create an instance of the abstract class or interface" hatası alırsınız.

Şimdi taşıttan bir "Araba" sınıfı türetelim ve ilgili metodu implement edelim.

class Araba : Tasit
{
    public override bool UygunOrtamVarMi(string ortam)
    {
        return ortam == "Kara";
    }
}

Eğer sınıf içinde soyut metodu yazmasaydık ya da kuralına göre tanımlamamış olsaydık "does not implement inherited abstract member" hatası alacaktık. Neyse ki metodu yazdık ve çalıştırılmak istenen ortamın "kara" olup olmadığına baktık. Aşağıdaki gibi deneyebilirsiniz.

Araba araba = new Araba();
araba.Calistir("su");

Bir başa örnekte "Gemi" sınıfını oluşturalım.

class Gemi : Tasit
{
    public bool Kaptan { get; set; }

    public override bool UygunOrtamVarMi(string ortam)
    {
        if (!this.Kaptan)
        {
            Console.WriteLine("Kaptan yok haberin olsun...");
        }

        return ortam == "su";
    }
}

Soyut sınıflar base class olmak üzere yazılırlar. Örneğin; bir çok geliştiricinin olduğu bir projede karışıklık çıkmaması için bir yazılımcının diğerine "bu sınıftan referans alma ama bu iş için yazacağın sınıf şu, şu, şu özellikleri mutlaka içersin" deme yoludur.