İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır

Inheritance (Kalıtım)

Inheritance Kavramı

Bir class'ın başka bir class'daki property ve method'lara sahip olmasına inheritance denir.. Belli bir class, daha genel bir kavramı ifade eden class'ın üyelerine sahip olarak, onları tekrar tanımlamak zorunda kalmaz. Bir class'ın diğerindeki özellikleri miras olarak alması için kullanılan keyword 'extends' dir. Anlam olarak "Bu class şu class'ı 'genişletir' yani ondaki property ve methodları alır ve yenilerini ekler" demektir.

Inheritance, bazı durumlarda başka birinin yazdığı class'a bazı eklemeler yaparak belli bir işlem için kullanılır hale getirmek için kullanılabilir. Böylelikle sadece o class'ta olmayan property ve methodları eklemek suretiyle çok kısa sürede gelişmiş bir class sahibi olabilir. Bazen de ortak bir çok özellik içeren iki nesnede de aynen bulunan property ve methodları tanımlamaktan kurtulmak için kullanılabilir.

'Extends' Kullanımı

Diyelim ki bize bir küp ve küre'yle hacim, yüzey alanı, kütle ve ağırlık gibi hesaplamalar yapmamız gerekiyor. Bir çok özellik bu iki nesnede ortaktır. İkisinde de bir özkütle vardır. Hacim hesaplama teknikleri değişebilir ama kütle hesap teknikleri değişmez. Her iki cisim için de kütle, özkütle ile hacmin çarpımıdır. Bu iki cisim için SimpleSphere ve SimpleCube gibi iki class yapacaksak, ortak özellikleri içeren SimpleBody diye bir class yapmak akıllıca olur. Şimdilik sadece SimpleSphere'e ihtiyacımız varsa dahi, sonradan SimpleCube veya başka bir cismin gerekebileceğini düşünerek bir base class yapmak da faydalı olabilir.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class SimpleBody{
  2   private double density=1.0;
  3   public SimpleBody(){
  4   }  
  5   public SimpleBody(double d){
  6     setDensity(d);
  7   }  
  8   public void setDensity(double d){
  9     density=d;
 10   }
 11   public double getDensity(){
 12     return density;
 13   }
 14 }

Görüldüğü gibi, cismin yoğunluğunu belirten bir property ve bunula ilgili iki method var. Bu class'ı 'extend' eden SimpleSphere adlı bir class yapalım.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class SimpleSphere extends Body{
  2   public double radius=1.0;
  3   public SimpleSphere(double d,double r){
  4     super(d);
  5     radius=r;
  6   }
  7   public double getVolume(){
  8     return (3.14 * radius * radius * radius )/3;
  9   }  
 10 }

Yazdığımız SimpleSphere class'ın radius property'si dışında, density property'si de vardır. Şöyle bir kod parçası geçerlidir :

	SimpleSphere s=new SimpleSphere();
	s.setRadius(3.6);	
	s.setDensity(1.2);

Extend eden class'a subclass, extend edilen class'a da super class (veya base class) denir.

Super Class'ın Constructor'unun Kullanımı

Bir class'ı extend eden class'ın constructor'u extend ettiği class'ın constructor'unu 'super()' şeklinde çağırabilir. Bu şekilde super class'a veri aktarılmış olur. SimpleSphere class'ına bir constructor ekleyelim :

	public SimpleSphere(double d,double r){
		super(d);
		setRadius(r);
	}	

Bu şekildeki constructor'u kullanmak istersek

	SimpleSphere sphere=new SimpleSphere(3.6,1.2);

biçiminde bir kod yazmak yeterli olacaktır.

Bir constructor'ın diğerini çağırması durumunda super ifadesi kesinlikle ilk satırda belirtilmelidir. Herhangi bir kod parçası yazıldıktan sonra super class'ın bir constructor'u çağrılamaz.

Super class'ın constructor'u açık olarak çağrılmadıkça, parametresiz olan super() constructor'un çağrıldığı varsayılır. Super constructor'un böyle bir constructor'u yoksa mutlaka parametreli bir constructor çağrılmalıdır. Aksi takdirde derleyici hata verir.

Super Class'larda Protected Property'ler

Base class'da 'private' olan property'lere subclass'tan erişilemez. Erişilmesi için 'public' yapılması durumunda da ilgili üye herkese açık hale gelecektir. Sadece extend eden class'ın erişimini sağlamak için 'protected' erişim değiştiricisi kullanılır. SimpleBody class'ında 'density' property'si protected olmalıdır.

Overriding (Ezme)

Bir subclass super class'ının bir methodunun davranışını yeniden yazabilir, yani super'dekini ezebilir. Buna overriding denir. Bunun için aynı üst class'ın method'unun signature'uyla aynı olmalıdır. Bu işlem bazen methodun tamamen değiştirme, bazen de sadece bir ekleme yapma şeklinde yapılır. SimpleSphere class'ında, SimpleBody class'ında density property'sini belirleyen setDensity() method'u, negatif değer kontrolü yapacak şekilde değiştirmek için

	public void setDensity(double d){
		if(d>=0){
			density=d;
		}else{
			density=0.0;	
		}

	}

biçimde bir kod yeterlidir. SimpleSphere class'ında setDensity() methodu çağrıldığında bu yeni method geçerli olacaktır. Elbette bu değişiklik SimpleBody class'ı ve bu class'ı extend eder diğer class'ları bağlamaz. Onlar hala üsteki methodu çağırırlar.

Override eden method, override edilen methodu çağırabilir. Ancak ikisinin de adı da parametreleri de aynı olduğu için super anahtar sözcüğü kullanılır.

	public void setDensity(double d){
		if(d>=0){
			super.setDensity(d);
		}else{
			super.setDensity(0.0);
		}
	}

Super class'da olan bir method'un ismiyle aynı farklı parametreler alan bir method yazlıabilir. Ama bu durumda overriding değil overloading yapılmış olur. Yani var olan bir method'u değiştirmek yerine yeni bir method eklenmiş olur. İlk method çağrıldığında yine eskisi gibi çalışır.

Multiple Inheritance (Çoklu Kalıtım)

Java'da 'multiple inheritance', yani bir class'ın iki veya daha çok class'ı extend etmesi, onların property ve method'larını miras alması mümkün değildir. C++ gibi diğer nesneye yönelik dillerde bu mümkündür ama Java'da kafa karışıklığına, çalışma zorluğuna, birbirine girmiş yapılar yaratmaya neden olduğu için izin verilmemiştir. Java'daki single inheritance (tekli inheritance)da hangi class'ın hangisini extend ettiği bir ağaç yapısı şeklinde net bir şeklide görülmektedir. Aslında bu yazılım tasarımı açısından da gereklidir. Örneğin bir hayvan hem memeli hem de kuş olmaz. Hem balık hem memeli olmaz. Hatta yarasa uçsa bile, balina yüzse bile onlar birer memelidir. Yarasanın kuşlar gibi uçtuğunu görüp onu hem memeli hem kuş saymak ne kadar yanlışsa, bir class'ı iki ayrı class'ın özelliklerine birden sahip olması gerektiğini düşünmek o derece yanlıştır. Eğer tasarımınız bunu zorunlu kılıyorsa ya yanlış tasarım yapmışsınızdır ya yanlış çözümleme yapmışsınızdır. Çoklu kalıtımın gerekli gibi göründüğü durumlarda başka çözüm yolları devreye girer. Bunları programcı ve sistem tasarımcıları Java'da bilgi ve deneyimlerini arttırdıkça öğrenebilirler. Örneğin iki class'ı extend etmek yerine birini extend etmek, diğerini bir property olarak tanımlamak ve kullanmak mantıklı bir çözüm olabilir..

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır