Giriş
Bu makalede nesneye yönelik programlamanın (OOP) en önemli bölümlerinden olan kalıtım konusuna değinilecektir. Makale içerik olarak extends sözcüğünün kullanımını kapsamaktadır. Ara yüzlerde (interface) bu başlık altında incelenmesi gerekmektedir fakat bu konu başka bir makalede incelenecektir.
Kalıtım Nedir?
Kalıtım bir sınıfın özelliklerini başka bir sınıfa aktarması veya başka bir sınıfın kullanmasına izin vermesidir. Bu konu çok ayrıntılı ve uzunca bir konudur ben ise kısaca bazı önemli noktalara değinip kalıtımın hangi halinin nerede kullanılması gerektiğini anlatmaya çalışacağım.
Türeme
Türeme kalıtımın ilk ayağıdır. Bir sınıfın başka bir sınıfın özelliklerini alması olarak tanımlanabilir. Hatta özellikerini aldığı sınıfı geliştirecek yeni özellikler elde edebilir. Bunu şu küçük örnek ile açıklamaya çalışayım.
Ana sınıfımız masa olsun ve biz bu sınıftan neleri türetebiliriz ona bakalım.
- Yemek Masası bir masadır.
- Yuvarlak Masa bir masadır.
- U Masa bir masadır.
Bu üç masanın ortak özelliği masa olmasıdır fakat şekil kullanılma yerleri ve amaçları hep farklıdır. Ama hepsinde olan birkaç ortak özellik olmalıdır ki bir birlerinden türesin.
Bu örnek çok sanal geldi ise programlamacı gözü ile bir türetmeden bahsedeyim.
Ana sınıfımız AnaIs sınıfı olsun ve bu sınıf ekleme, silme, günçelleme özelliklerini barındırsın. Biz bu sınıftan bu işleri yapan ama aynı zamanda sorguda çeken bir sınıf türetebiliriz. Ayrıca yine bu sınıftan sadece daha özel işleri yapan bir sınıfta elde edebiliriz. Atasından alacağı ortak özellikleri geliştirebilir başka bir forma sokabiliriz.
Bu bize ne kazandıracak diye soranlara cevap
- Yeniden kullanma sayesinde daha az kod
- Kodda esneklik
- Bağımlılığın azalması
- Yan etkilerin azalması
Olarak ifade edilebilir.
Örnek:
Bu örneği iyice inceleyiniz ve türemenin nasıl yapıldığını anlamaya çalışınız.
public class Dikdortgen {
public int en;
public int boy;
public Dikdortgen() {
new Dikdortgen(0, 0);
}
public Dikdortgen(int en) {
new Dikdortgen(en, 0);
}
public Dikdortgen(int en, int boy) {
Dikdortgen.en = en;
Dikdortgen.boy = boy;
}
public int getAlan()
{
System.out.println("Bu ana sinıf");
return en*boy;
}
}
Bu Ana sınıfımız. şimdi de türettiğimiz sınıfı yazalım.
public class Kare extends Dikdortgen{
public int kenar;
public Kare() {
super(0,0);
}
public Kare(int kenar) {
super(kenar,kenar);
}
}
şimdi neler yapılmış adım adım anlatalım.
- Görüldüğü üzre ana sınıfımız olan Dikdörtgen() sınıfı en , boy özniteliklerine sahip. Yapılandırıcıları üç adet ve aldığı parametrelere bağlı olarak ya bir nokta, ya bir doğru parçası yada bir dikdörtgen oluşturuyor.
- Bu sınıf ayrıca dikdörtgenin alanını hesaplayan getAlan() metoduna sahip.
- Türeyen sınıfımız ise kenar özniteliğine sahip.
- Yapılandırıcısı kendisini değil ana sınıfının bir örneğini oluşturuyor. Bu nasıl yapıyor derseniz super() sözcüğü ana sınıfını çağırmak için kullanılıyor. Yani biz bir Kare() nesnesi oluşturduğumuzda aslında yine bir Dikdörtgen() sınıfı nesnesi oluşturmuş oluyoruz.
- Biz istersek super() sözcüğünü kullanmadan Kare() sınıfının nesnesini de oluşturabiliriz. O zaman bir Kare() nesnesi oluşturduğumuzda bize Kare() sınıfının örneği dönecektir.
- getAlan() metodunu çağırdığımızda Dikdörtgen() sınıfının medodu çağırılacak. Eğer biz bu metodu override etmiş olsaydık o zaman kendi metodunu çağırmış olacaktı.
şimdi bu dediklerimizi daha iyi açıklayan bir deneme sınıfı yazalım ve sonuçları üzerinden konuyu kavramaya devam edelim.
public class DenemeMain {
public static void main(String[] args) {
Dikdortgen dik = new Dikdortgen(3,4);
System.out.println("Alan Dikdortgen: "+dik.getAlan());
System.out.println("");
System.out.println("");
Kare kare = new Kare(5);
System.out.println("Bu Endir: "+kare.en);
System.out.println("Bu Boydur: "+kare.boy);
System.out.println("Bu Kenardir: "+kare.kenar);
System.out.println("");
System.out.println("Alan Kare: "+kare.getAlan());
}
}
Bu sınıfın çıktısı ise aşağıdadır.
Bu ana sinif
Alan Dikdortgen: 12
Bu Endir: 5
Bu Boydur: 5
Bu Kenardir: 0
Bu ana sinif
Alan Kare: 25
Sonuçları yorumlayacak olur isek.
- Önce bir dikdörtgen nesnesi oluşturduk ve alanını yazdırdık. Burada sonuç beklediğimiz gibi oldu.
- Sonra kare nesnesi oluşturduk. Burada dikkat edilir ise dikdörtgen sınıfından yeni bir nesne oluşmuştur. En, boy ve kenar öznitelikleri yazıldığında gelen sonuçlardan durum anlaşılıyor. En ve boy öznitelikleri atanmış ama kenar özniteliğinin atanmadığını görüyoruz.
- En son alanı yazdırdığımızda yine türediği nesnenin metodunu kullandığını görüyoruz.
- Türeme işlemi kare sınıfına türediği dikdörtgen sınıfının özelliklerini katmış oldu. Zeten amaçta buydu.
şimdi Kare() sınıfını tekrar yazacağız ve değişiklikleri göreceğiz.
public class Kare extends Dikdortgen{
public int kenar;
public Kare() {
super(0,0);
}
public Kare(int kenar) {
this.kenar = kenar;
}
public int getAlan()
{
System.out.println("Bu tureyen sinif");
return kenar*kenar;
}
}
İşte bu yeni sınıfımız. Dikkat edilir ise yapılandırıcılardan sadece biri türediği sınıfın bir nesnesini döndürüyor. Diğer yapılandırıcı ise Kare() sınıfının kendi nesnesini döndürecek. Bu dediklerimizi test sınıfımızı tekrar çalıştırarak görebiliriz.
Bu ana sinif
Alan Dikdortgen: 12
Bu Endir: 0
Bu Boydur: 0
Bu Kenardir: 5
Bu tureyen sinif
Alan Kare: 25
Sonuçları inceleyecek olur isek;
- İlk nesne oluşumunda bir değişiklik bulunmamaktadır.
- Kare sınıfında oluşturulan nesne ise artık kensine ait bir örnek döndürmektedir bunuda sonuçlardan rahatlıkla görmekteyiz.
- Yeni sınıfımızda getAlan() metodunu override etmiştik o nedenle bu metodu çağırdığımızda kandi metodunu kullandığı görülmektedir.
Konuyu toparlamak gerekirse
- Bir sınıf diğer sınıftan türediğinde türediği sınıfın özelliklerine sahip olabilir.
- Siz ister bu özellikleri kullanır isterseniz bu özellikleri geliştrebilirsiniz.
- Yeni sınıfın yapılandırıcılarını yöneterek ya türediği yada kendi örneğinin dönmesini sağlayabilirsiniz.
- Türediği sınıfın metodlarını aynen kullanbilir yada override edip aynı metodun farklı işler yapmasını sağlayabilirsiniz.
Sonuç
Bu makalemizde kalıtımın en öenmli ayaklarından olan türeme işlemini öğrendik. super() sözcüğünün nasıl kullanıldığını ve ne işe yaradığını anladık. Ayrıca türeme işleminin neden gerekli olduğunu ve kodlamaya neler kattığını öğrendik. Yeni bir makalede görüşmek üzere...

[
09.09.2005]