Nesne Tabanlı Yaklaşımda Inheritance’ın Gücünü Keşfetmek: Nesne Tabanlı Programlamanın Temel Mekanizması
Nesne tabanlı programlama yaklaşımında en çok duyduğumuz ve aslında yaklaşımın temel mekanizmasını oluşturan konsept Inheritance’dır. (Türkçe karşılığı ile Kalıtım)

Inheritance’ın temel amacı bir yazılım sisteminde ki yapısal bileşenleri hiyerarşik olarak organize etmektir.
Hiyerarşide yukarı doğru çıkıldıkça özelden genele doğru giden, benzer soyut kavramların katmanlı olarak gruplandığı bir yapı vardır.
Hiyerarşik yapıyı daha iyi anlamak için günlük hayattan bir örnek verelim:

Hiyerarşik yaklaşım yazılımda kodun yeniden kullanılabilirliğini arttırdığı gibi farklılaşan davranışlarında kolayca uygulanmasını sağlar.
Bu yaklaşımda bir base class (parent class veya super class da denilir) bir de subclass (veya child class) kavramı vardır.
Bir base class’ı extend eden classa subclass denir. Ve subclass base class’ın constructor metodu hariç diğer tüm metodlarını inherit eder. Fakat subclass sadece extend ettiği class’ın metodlarından oluşmayabilir. Subclass extend ettiği superclass’ın alan ve metodlarına ek olarak yeni alanlar ve methodlar ekleyebilir veya superclass’ta var olan metodları override ederek özelleştirebilir.
İki class arasında ki inheritance örneğine bakalım:

Yukarıda ki örnekte PredatoryCreditCard class’ı CreditCard class’ını extend ederek alanlarını ve metotlarını inherit ediyor. Burada görüldüğü gibi, PredatoryCreditCard class’ı inherit ettiği alanlara ek olarak apr alanını eklemiş, charge() metodunu override ederek kendine göre özelleştirmiş ve yeni bir metod olarak processMonth() metodunu oluşturmuş.
Bu diagramın kodunu Java ile yazacak olsaydık PredatoryCreditCard class’ı aşağıdaki gibi implement edilmiş olurdu:
public class PredatoryCreditCard extends CreditCard(){
//additional field: apr
private double apr;
//constructor of this class
public PredatoryCreditCard(String customer, String bank,
String account, int limit, double initialBalance,
double rate){
super(customer,bank,account,limit,initialBalance);
this.apr = rate;
}
//new method of subclass
public void processMonth(){
//required operations
}
//overriding method from superclass
@override
public boolean charge(double price){
//required operations
//can call inherited charge method within it
}
}
- Java dilinde her subclass yalnızda bir class’ı extend edebilir. (Single Inheritance) Bunun nedeni class’ların içerisinde alanlar ve metodlar concrete olarak implement edildiği için eğer sınıflar arasında çoklu kalıtıma izin verilseydi karışıklık olurdu. Interface’ler için bu durum farklıdır. Classlar arası multiple inheritance’a izin veren başka yazılım dilleri vardır (C++, Python, Ruby, Perl).
- Subclass’ın constructor metodunda ilk satırda superclass’ın construtor’ı super(…) ile çağırılmalıdır. Eğer explicit olarak çağırılmazsa otomatik olarak super()’in sıfır parametreli hali çağırılır.
Inheritance diyince akla Polymorphism, Interface’ler ve Abstract Class’lar da gelir. Bu kavramları da diğer yazılarımda bulabilirsiniz.
Yazılım dillerinden bağımsız olarak inheritance türlerini aşağıdaki gibi sınıflayabiliriz:

- Single Inheritance (Tek Miras): Single inheritance, bir sınıfın sadece bir tane üst sınıftan (parent class) türetebileceği miras türüdür. Alt sınıf (child class), yalnızca bir üst sınıfın özelliklerini ve davranışlarını devralır. Bu miras türü, basit ve düzenli sınıf hiyerarşileri oluşturmak için kullanılır.
- Multiple Inheritance (Çoklu Miras): Multiple inheritance, bir sınıfın birden fazla üst sınıftan türeyebileceği miras türüdür. Alt sınıf, birden fazla üst sınıfın özelliklerini ve davranışlarını devralır. Bu miras türü, daha karmaşık sınıf ilişkileri gerektiren durumlarda kullanılır. Bazı programlama dilleri, multiple inheritance’ı desteklerken, bazıları desteklememektedir.
- Multilevel Inheritance (Çok Katmanlı Miras): Multilevel inheritance, bir sınıfın başka bir sınıftan türediği ve bu alt sınıfın da başka bir sınıftan türediği miras türüdür. Bu şekilde sınıf hiyerarşileri katmanlar halinde oluşturulur. Alt sınıf, doğrudan üst sınıfın özelliklerini ve davranışlarını devralırken, üst sınıf da kendi üst sınıfının özelliklerini ve davranışlarını devralır.
- Hierarchical Inheritance (Hiyerarşik Miras): Hierarchical inheritance, birden fazla alt sınıfın aynı üst sınıftan türediği miras türüdür. Bu miras türünde, bir üst sınıfın özellikleri ve davranışları, birden fazla alt sınıf tarafından paylaşılır. Bu şekilde, benzer özelliklere sahip sınıflar gruplandırılabilir ve kodun yeniden kullanımı sağlanabilir.
- Hybrid Inheritance (Karma Miras): Hybrid inheritance, bir sınıfın hem single inheritance hem de multiple inheritance ile ilişkilendirilebileceği karma bir miras türüdür. Bu miras türü, birden fazla üst sınıfın özelliklerini ve davranışlarını devralan sınıfların oluşturulmasını sağlar. Bazı programlama dillerinde, bu tür miras yapısı doğrudan desteklenmez, ancak çoklu miras ve tek mirasın birleşimiyle benzer bir yapı elde edilebilir.
Bu miras türleri, yazılım geliştiricilere farklı durumlar için çeşitli sınıf ilişkileri ve yapıları oluşturma esnekliği sunar. Mirasın doğru kullanılması, kodun düzenini, yeniden kullanılabilirliğini ve bakım kolaylığı gibi avantajlar sağlar.
Kaynaklar:
Data Structures & Algorithms in Java — Micheal T. Goodrich, Roberto Tamassia, Micheal H. Goldwasser