C# programlama dilinde kalıtım konusunun en temel gereksinimlerinden birisi de Abstract anahtar sözcüğü ile giderilmektedir. Örneğin Şekil üst sınıfından türetilen Küp ve Küre gibi alt sınıflar olsun. Aslında doğrudan Şekil sınıfından üreteceğimiz nesneler yoktur, ama Küp ve Küre gibi sınıfların da çok sayıda ortak özelliği ve metodu olacağı için bu özellikleri teker teker yazmak yerine bir üst sınıftan kalıtmak gerekmektedir. Abstract anahtar sözcüğü de bu amaçla kullanılır.
- Abstract anahtar sözcüğü eğer bir sınıf için kullanılıyorsa, o sınıftan doğrudan nesne üretilemez, sadece alt sınıflarından üretilebilir.
- Abstract anahtar sözcüğü eğer metodlar için kullanılıyorsa, o sınıftan kalıtım ile türetilen her alt sınıf (interface'lerde olduğu gibi) o metodu içermek zorundadır.
Not: Interface ile abstract sınıf arasında iki temel fark vardır. Birincisi interface'lerde metodlar sadece bildirim olarak yazılabilir, abstract sınıflarda ise hem bildirim olarak yazılabilir hem de metod olarak işlevleri kodlanabilir. Diğer fark ise bir sınıfta birden fazla interface implement edilebilir ancak bir sınıf sadece tek bir sınıftan türetilebileceği için birden fazla abstract sınıftan kalıtım mümkün değildir.
Örnek 1: abstract sınıflardan new anahtar sözcüğü ile nesne üretmek mümkün değildir.
abstract class Sekil {
public string SekilAdi { get; set; }
}
Sekil sekil = new Sekil();
Hata çıktısı: Cannot create an instance of the abstract type of interface
Örnek 2: Sekil abstract sınıfından Küp alt sınıfını kalıtım türetelim ve Sekil üst sınıfına da alt sınıfları için mutlaka implement edilmesi gereken bir HacimHesapla metodu ekleyelim.
abstract class Sekil {
public string SekilAdi { get; set; }
public abstract double HacimHesapla();
}
class Kup :Sekil
{
public int Uzunluk { get; set; }
public Kup (int uzunluk)
{
SekilAdi = "Küp";
Uzunluk = uzunluk;
}
public override double HacimHesapla()
{
return System.Math.Pow(Uzunluk,3);
}
}
Not: Eğer Kup alt sınıfında HacimHesapla metodu yazılmazsa aşağıdaki gibi bir hata alınır.
... does not implement inherited abstract member 'Sekil.HacimHesapla()
Önceki bazı ilgili yazılarım için;
bkz: C# Sealed Anahtar Sözcüğü Nedir? Sealed Kullanımı ve Örnekleri?
bkz: C# Polymorphism (Çok Biçimlilik) Nedir?
bkz: C# Base Nedir? Kullanımı ve Örnekleri
bkz: Interface Nedir?
bkz: C# Override Nedir ve Nasıl Kullanılır?
bkz: C# Sınıf ve Nesne Nedir?