C# - Inheritance (Kalıtım) Tekniği
Daha önceden oluşturduğumuz bir sınıfa ait özelliklerin -field, property, method vs.- ikinci bir sınıfta bulunması için kalıtım kullanırız. Türetilen sınıfa base class, türemiş sınıfa derived class denir. Derived class içinde base class'tan alınan özelliklere yenileri eklenebilir ya da değiştirilebilir.
Türetilen ve türemiş sınıf arasında is a ilişkisi vardır. Örneğin; Kedi bir hayvandır. Burada "hayvan" türetilen sınıf, "kedi" türemiş sınıftır. Daha somut bir örnek yapalım ve forum için üye sınıfları oluşturalım.
class Uye { public string Ad { get; set; } public void MesajGonder() { Console.WriteLine("Mesaj gönderdim."); } } class Moderator : Uye { public void MesajSil() { Console.WriteLine("Mesajı sildim."); } }
Üye sınıfı foruma yeni katılan kullanıcıların sınıfı. En temel olarak üyenin bir adı olmalı ve burası bir forum olduğu için mesaj gönderebilmeli. Bir de forumdaki düzeni sağlayacak moderatörlere ihtiyacımız var. Bir moderatör bir üyenin tüm özelliklerine sahip olmalı çünkü o da forumu kullanıyor. Buna ek olarak bir de uygunsuz mesajları silebilmesi gerekir. Bunun için moderatörler için ayrı bir sınıf oluşturup ek olarak MesajSil
metodunu ekledik.
Base ve derived sınıflar arasında is a ilişkisinin olduğunu söylemiştik. Bu duruma göre "Moderatör bir üyedir" ancak "Üye bir moderatör değildir". Bir objenin bir sınıfın ya da o sınıftan türemiş bir sınıfın referansı olup olmadığına is
deyimi ile bakılır. Kontrol edelim.
Uye uye = new Uye{ Ad = "Umut" }; Moderator mod = new Moderator { Ad = "Çağdaş" }; if (mod is Uye) Console.WriteLine(mod.Ad + " bir üye."); else Console.WriteLine(mod.Ad + " bir üye DEĞİL."); if (uye is Moderator) Console.WriteLine(uye.Ad + " bir moderatör."); else Console.WriteLine(uye.Ad + " bir moderatör DEĞİL.");
* Bir sınıfı oluştururken küme parantezleri içinde özelliklerinin değerlerini verebilirsiniz.
Kodun çıktısı "Çağdaş bir üye. Umut bir moderatör DEĞİL." olacaktır. Bu yüzden aşağıdaki gibi bir tanımlama hatalı değildir.
Uye mod = new Moderator { Ad = "Çağdaş" };
Ancak aşağıdaki gibi bir tanımlama hata verecektir.
Moderator uye = new Uye { Ad = "Umut" };
Güncelleme: Tam tersi yazdığınız bir sınıfta kalıtımı engellemek istiyorsanız sealed
ifadesini kullanabilirsiniz.
sealed class MuhurluSinif { // Bir şeyler bir şeyler }
C# çoklu kalıtım (multiple inheritance) yapılmasına izin vermez. Yani bir sınıf sadece bir sınıfın özelliklerini miras alabilir. Ancak birden fazla interface'den miras alabilirler. Ki o başka bir yazının konusu.