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) kelimesi aslında biyolojide anlamı ile aynıdır. Adından da anlaşılacağı gibi bir sınıfın özelliklerini diğer sınıfa olduğu gibi aktarmasıdır.
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. Bunu Java kodları ile ifade edersek:
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. Bu da tekrarlı koda (duplicated code) sebep olur. Bu durum DRY (Don’t Repeat Yourself) prensibine aykırı.
Bu sorunu kalıtım (inheritance) kullanarak çözebiliriz. Bunun için öncelikle Person adlı bir sınıf tanımlıyoruz ve bu sınıfa Lecturer ve Student sınıfların ortak özelliklerini yerleştiriyoruz.
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 kod 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.
Kalıtımın diğer sağladığı bir özellik OOP’de polimorfizme imkan sağlamasıdır. Bunun için OOP: Polimorfizm yazısını okuyabilirsiniz.