OOP: Kalıtım

Bir önceki yazımda OOP konusuna giriş yapmış ve kapsüllemeyi anlatmıştım. Bu yazımda ise “Kalıtım” konusundan bahsetmek istiyorum. Kalıtım (inheritance) adından da anlaşılacağı gibi bir sınıfın özelliklerini diğer sınıfa olduğu gibi aktarmasıdır. Türkçe’de “miras” olarak da ifade edilmektedir.

Peki böyle bir özelliğe neden ihtiyaç duyarız. Bir üniversitedeki öğretim görevlilerini ve öğrencileri modelleyen iki sınıf tanımlayalım. Öğrenci sınıfı öğrencinin adını, soyadını, okul numarasını, T.C. kimlik numarasını, bölümünü içersin. Öğretim görevlisi sınıfı ise öğretim görevlisinin adını, soyadını, hangi bölümün kadrosunda yer aldığını, T.C. kimlik numarasını ve akademik ünvanını içersin. Bunun örneği aşağıdaki gibidir.

 

Student ve Lecturer adında Java sınıflarımız var. Bu sınıflar gördüğünüz gibi basit bir şekilde getter ve setter metodlarından oluşuyor. Bu iki sınıf arasındaki benzerlikleri düşünelim. id (T.C. Kimlik No) , name, surname, department değerleri aynı. Örneğin bir de üniversitede çalışan memurları modellersek yine aynı verileri tekrarlamak zorundayız. DRY (Don’t Repeat Yourself) prensibine aykırı bir durum.

Bu sorunu kalıtım (inheritance) kullanarak çözebiliriz. Bunun için öncelikle Person adlı bir sınıf tanımlıyoruz:

Gördüğünüz gibi Person sınıfımız önceki tanımladığımızın iki sınıfın özelliklerini içeriyor. Burada dikkat ederseniz bölümü eklemedim. Bunun sebebi uygulamamıza ekleyeceğimiz diğer personeller herhangi bir bölümde olmayabilirler. Ama her personelin T.C kimlik numarası, adı ve soyadı olmak zorunda. Student ve Lecturer sınıflarını aşağıdaki gibi değiştirebiliriz.

 

Student ve Lecturer sınıflarının tanımlarına dikkat edersek extends Person ifadesini görüyoruz. Java’da kalıtım extends anahtar kelimesi ile yapılır. Kalıtım ile Person sınıfının bütün özelliklerine hem Student hem de Lecturer sınıfı sahip oldu. Yani Student ve Lecturer sınıfı da id, name, surname alanlarına ve getter/setter metodlarına sahip.  Bu sayede veri tekrarından kurtulmuş olduk.

Not: Önceki yazımda erişim belirleyicilerinden bahsetmiştim. private ile tanımlanan metodlar veya alanlara sınıf dışından erişilemez. Burada name, surname ve id alanlarına direkt olarak erişemeyiz. Fakat public olan getter ve setter metodları sayesinde bu değişkenlere erişmemiz mümkün. Sadece genişletilen (türetilen) sınıflardan (Student ve Lecturer) erişmek isteseydik name, surname ve id alanlarını protected erişim belirleyicisi ile tanımlamamız yeterli olacaktır. protected ile tanımlanan alanlar ve metodlar aynı zamanda aynı paket içerisindeki diğer sınıflar tarafından da erişilebilir.

Object Sınıfı

Java’da Object adlı bir sınıf bulunmaktadır. Bu sınıf toString(), equals() gibi birkaç metoda sahiptir. Eğer oluşturduğunuz sınıf extends genişletilmediği takdirde varsayılan olarak Object sınıfından genişletilmiş olacaktır. Yukardaki örnekte Person sınıfı extends ile genişletilmediği için varsayılan olarak Object sınıfından genişletilmiştir. Bu sayede Java’daki bütün sınıflar Object sınıfından genişletilmiş olur ve toString(), equals() gibi metodlara sahiptir.

İyi çalışmalar