Kalıtım OOP(Object Oriented Programming)’nin önemli bir parçasıdır. Bu mekanizma bir sınıftan diğerine alan(field) ve metotları miras olarak aktarmak için kullanılır.
Önemli terminolojiler ;
- Super Class (Süper Sınıf) : Metotları ve alanları(fields) başka bir sınıfa miras bırakan veya aktaran sınıflar olarak tanımlarız. (Base Class veya Parent Class olarak ta isimlendirilir.)
- Sub Class (Alt Sınıf): Diğer bir sınıftan metotları veya alanları miras olarak alan sınıf olarak tanımlarız. Miras aldığı metotlar ve alanlar dışında kendi metot ve alanlarına da sahip olabilir. (Derived Class, Extended Class veya Child Class olarak ta isimlendirilir.)
- Reusability (Tekrar Kullanılabilirlik) : Kalıtım tekrar kullanılabilirliği destekler. Yeni bir sınıf oluşturmak istediğimizde ve ihtiyacımız olan bazı kodlara sahip bir class varsa yeni sınıfımızı bu sınıfın alt sınıfı olarak alabiliriz. Bunu yaparak varolan sınıfın alanlarını(fields) ve metotlarını tekrar tekrar kullanabiliriz.
Kalıtım Türleri (Inheritance Types)
5 çeşit kalıtım türü vardır;
- Single Inheritance
Bu kalıtım türünde alt sınıf süper sınıftan metot ve alanları miras alır.
- Multilevel Inheritance
Bu sınıf türünde alt sınıfımız süper sınıftan miras alır. Aynı zamanda bu alt sınıf bir süper sınıf gibi davranarak başka bir sınıfa miras olarak metot ve alanlarını verir. Aşağıdaki resimde de görüldüğü üzere, B sınıfı A sınıfından miras alır, C sınıfı B sınıfından miras alır, bu düz mantık olarak gidiyor.
Şimdi bu noktada B’nin içinde hem A’nın metot ve alanları hem de kendi içinde oluşturduğu metot ve alanlar olmuş oldu. Daha sonra C sınıfı B sınıfından miras aldığında bu nedenle A’dan B’ye giden metot ve alanlar C’ye de gitmiş oldu.
- Hierarchical Inheritance
Bu kalıtım türünde bir sınıf birden fazla alt sınıfın süper sınıfı olarak çalışır diyebiliriz. Aşağıdaki resimde de anlaşılacağı üzere A sınıfı B,C ve D sınıflarına süper sınıf olarak metot ve alanlarını miras bırakır.
- Multiple Inheritance (Interface aracılığı ile)
Bu kalıtım türünde bir alt sınıfın birden fazla süper sınıfı olabilir. Ancak bu durum sadece interface ile gerçekleştirilebilir. C# multiple inheritance’ı sınıflar ile desteklememektedir.
- Hybrid Inheritance (Interface aracılığı ile)
Bu kalıtım türü yukarıda gösterdiğim kalıtım türlerinin karışımı olarak tanımlanabilir. C# class yapısı ile bu kalıtım türünü desteklemez bu nedenle interface aralığı ile gerçekleştirilir.
C# Kalıtım Hakkında Önemli Noktalar;
- Object sınıfı hariç, ki bu sınıfın süper sınıfı yoktur, her sınıf sadece bir süper sınıfa sahiptir(Single Inheritance). Belirli bir süper sınıfın olmadığı durumda her sınıf Object sınıfının bir alt sınıfıdır.
- Bir süper sınıf istediğiniz sayıda alt sınıfa sahip olabilir. Ama bir alt sınıf sadece bir adet süper sınıfa sahip olabilir. Bunun nedeni C# multiple inheritance’ı desteklememektedir. Yukarıda da belirttiğim gibi bunu sadece interface aracılığı ile gerçekleştirebiliriz.
- Bir alt sınıf, süper sınıfın tüm üyelerini (fields,methods) miras alır. Costructors(yapıcılar) üye değildir bu nedenle onlar alt sınıf tarafından miras alınmaz. Ama süper sınıfın constructor’ı alt sınıf tarafından tetiklenebilir.
- Süper sınıfta bulunan private bir üye alt sınıf tarafından miras alınamaz. Ama biz bu private üyelere ulaşmak için property kullanırız (get ve set metotları), ve bununla birlikte bu private üyeleri kullanabiliriz.
Örnek üzerinden gidecek olursak;
İlk olarak Human sınıfımızı oluşturduk. Sonrasında ise alanları(fields) tanımladık ve private erişim belirleyicisi ile tanımlanan ID değişkenimizi id property’si ile kapsülledik.
Burada ise Employee sınıfını tanımladık ve Human sınıfını bunun süper sınıfı olarak atadık. Bunu yaptığımızda Human sınıfı içerisindeki tüm üyeleri (fields,methods) miras almış oldu. Daha sonra kendi içerisinde Position ve Salary alanlarını (fields) oluşturduk ama bunları herhangi bir property ile kapsüllemedik.
Son olarak ise SetValues metodunu oluşturduk. Farkettiğiniz üzere SetValues metodu içerisinde id,Name ve Surname var ancak Employee içerisinde böyle değişkenler göremiyoruz. Peki nereden geliyor bu değerler? İşte tam bu noktada bahsettiğim miras alma devreye giriyor. Bu gördüğünüz değişkenleri Human sınıfından almıştı. Şimdi Employee içerisinde de bulunan bu değişkenlere metot ile değer atadık. Bu metodu yazının ilerleyen kısımlarında kullanacağız.
Yukarıda Teacher sınıfını tanımladık ve buna süper sınıf olarak Employee sınıfını atadık. Branch alanını tanımladık ve setValues2 metodu ile bazı değişkenlere değerler atadık. Farkettiğiniz üzere Position ve Salary değişkenlerini Employee’den miras almıştı.
Burada şu nokta çok önemli, yukarıda da bundan bahsetmiştim, Teacher sınıfı, Employee sınıfının Human sınıfından miras aldığı üyelerle birlikte miras alır, yani Human sınıfının üyelerini de almış olur. Bunu şimdi göreceğiz.
Yukarıda Teacher sınıfından bir instance nesne oluşturduk. Employee sınıfı Human sınıfından aldığı üyeleri (fields,methods) aynı şekilde Teacher sınıfına aktarmıştı ve bunu yukarıda görüyoruz. Teacher sınıfından türettiğimiz nesne içerisinde id,Name,Surname,Position,Salary ve Branch bulunuyor. Bunlarla birlikte SetValues() ve setValues2() metotlarıda bulunuyor. Bunları sonuç olarak textBox içerisine yazdırdık.