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

Polymorphism (Çok Biçimlilik)

Polymorphism (Çok Biçimlilik)

Nesneye yönelik programlamada polymorphism , nesnelerin içeride farklı çalışmalarına rağmen dışarıdan aynı biçimde görünmelerine denir. Bu şekilde, bir grup nesneyi kullanan class'lar implementation'la ilgili detayları bilmek zorunda kalmazlar, içerideki değişikliklerden etkilenmeden çalışmaya devam ederler. Aynı class'ı extend eden veya aynı interface implement eden class'lar standart bir şekilde erişilebilme özelliklerine sahip olurlar.

Polymorphism Olmadan Kodlama

Bir miktar kübün toplam kütlesini hesaplamak istediğimizi düşünelim. Küp class'ının ana hatları şöyle olsun :

public class Cube{
	// ...
	public double getMass(){
		// ...
	}
}

Bu class'tan yaratılmış instance'ların kütlelerini toplayan bir method ve program yazalım.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class CubesMassCalculator{
  2   public static double calculateTotalMass(Cube[] cubes){
  3     double total=0.0;
  4     for(int i=0;i<cubes.length;i++){
  5       total+=cubes[i].getMass();
  6     }
  7     return total;
  8   }
  9   public static void main(String[] args){
 10     Cube[] cubes=new Cube[3];
 11     cubes[0]=new Cube(2.2,10.5);
 12     cubes[1]=new Cube(3.1,6.1);
 13     cubes[2]=new Cube(5.6,1.2);    
 14     cubes[3]=new Cube(9.3,6.1);
 15     cubes[4]=new Cube(4.0,3.7);        
 16     double total=calculateTotalMass(cubes);
 17     System.out.println("Total Mass : "+total); 
 18   }
 19 }

Aynı programı küreler içinde yazabiliriz. Sphere class'ımız da aynı biçimde tanımlanmış olsun :

public class Sphere{
	// ...
	public double getMass(){
		// ...
	}
}

Ancak calculateTotalMass() method'unu şu biçimin de tanımlamalıyız :

	public static double calculateTotalMass(Sphere[] spheres){
		// ..
	}

Peki ya bir nesne dizimiz değişik cisimlerden oluşuyorsa? Örneğin üç tane kübümüz iki tane küremiz varsa ne olacak? Onun için şöyle bir method daha yazmalıyız.

	public static double calculateTotalMass(Cube[] cubes,Sphere[] spheres){
		// ..
	}

Ya dikdörgenler prizması ve piramit gibi cisimlerimiz de varsa ne yapacağız? Her biri için ayrı toplamlar alan bir sürü method yazmaktan başka çaremiz kalmayacak. İşte polymorphism burada devreye giriyor.

Ploymophism'den Yararlanma

Eğer iki class'da ortak bir method varsa, bu ikisinin de temel alacağı Body şeklinde bir class yapmak gereklidir :

class Body{
	// ...
	public double getMass(){
		// ...
	}
}
class Cube extends Body{
	// ...
}
class Sphere extends Body{
	// ...
}

Çeşitli tipte cisimlerden olişan bir dizinin toplam kütlesini hesaplayan bir class yapalım.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class BodiesMassCalculator{
  2   public static double calculateTotalMass(Body[] bodies){
  3     double total=0.0;
  4     for(int i=0;i&amp;bodies.length;i++){
  5       total+=bodies[i].getMass();
  6     }
  7     return total;<noframes></noframes>
  8   }
  9   public static void main(String[] args){
 10     Body[] bodies=new Body[3];
 11     bodies[0]=new Cube(2.2,10.5);
 12     bodies[1]=new Sphere(3.1,6.1);
 13     bodies[2]=new Cube(5.6,1.2);    
 14     bodies[3]=new Cube(9.3,6.1);
 15     bodies[4]=new Sphere(4.0,3.7);        
 16     double total=calculateTotalMass(bodies);
 17     System.out.println("Total Mass : "+total); 
 18   }
 19 }

Görüldüğü gibi tek method çeşitli cisimlerin kütlelerini toplayabiliyor. Her cismin farklı bir hacim ve kütle hesaplama şekli olduğu halde. Bunun için tek gerekli şart Cube ve Sphere class'larının Body class'ını extend etmeleri ve Body class'ında getMass() şeklinde bir method olmasıdır. Pyramid diye Body'yi extend eden bir class yapıp, dizinin dördüncü elamanı olarak verirseniz calculateTotalMass() methodu yine toplam kütleyi doğru olarak hesaplayacaktır. Çünkü o zaten Sphere'ı da Cube'ü de tanımamaktadır. Sadece Body class'ını tanımaktadır ki, bir cismin kütlesi olması, onun kütlesini toplama dahil etmesi için yeterlidir.

Interface ve Abstract Class'larla Polymorphism

Polymorphism özelliğini kullanmak için, class'ların belli bir concrete base class'a sahip olmaları gerekmez. Base class'ları abstract olabilir. Hatta ortak kullanılan method'un kendisi bizzat abstract olabilir. Bu biçimde interface'lerin de kullanılması mümkündür. Aynı interface'i implement eden her class aynı type'da kabul edilir. Yukarıdaki örnekteki class'lar

abstract class Body{
	// ...
	abstract public double getMass();
}
class Cube extends Body{
	// ...
	public double getMass(){
		// ...
	}
}
class Sphere extends Body{
	// ...
	public double getMass(){
		// ...
	}
}

şeklinde de tanımlanmış olsalar aynı şekilde kullanılabilirdi. Body'nin bir class değil de bir interface olarak tasarlanması durumunda da aynı şey geçerlidir.

interface class Body{
	public double getMass();
}
class Cube implements Body{
	// ...
	public double getMass(){
		// ...
	}
}
class Sphere implements Body{
	// ...
	public double getMass(){
		// ...
	}
}

Dosya Listesi

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