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

Interface'ler ve Abstract Class'lar

Interface Kavramı

Java'da interface, bir class'ta olması gereken method ve property'leri tanımlayan yapıdır. Kendisi normal bir class değildir, sadece neyin yapılacağını göstermekte, ancak nasıl yapılacağını göstermemektedir. Örnek olarak, bir madde'de ne gibi işlevler ve özellikler olması gerektiğini belirten bir interface yazalım.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public interface Matter{
  2   public double getVolume();  
  3   public double getMass();    
  4 }

Bu ifade, 'bir maddenin yoğunluğu, hacmi ve kütlesi olur' demenin Java'daki yoludur. Ancak görüldüğü gibi maddenin yoğunluğu nasıl hesaplanır, kütlesi nasıl verilir, hiç bir şekilde belirtmemektedir. Sadece ne olması gerktiğini söylemektedir.

Interface'in Implementation'u

Bir class'ın interface'deki bütün method'ları içerdiğini, gerçekleştirdiğini belirtmesine implementation denir ve 'implements' keyword'üyle kullanılır.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class CubeMatter implements Matter{
  2   public double density=1.0;
  3   public double edge=1.0;
  4   public double getDensity(){
  5     return density;
  6   }
  7   public double getVolume(){
  8     return edge*edge*edge;
  9   }  
 10   public double getMass(){
 11       return density*edge*edge*edge;
 12   }    
 13 }

Burada "Küp diye bir nesnemiz var ve o bir maddedir, yani bir maddede olabilecek bütün nitelikler onda da bulunur." demiş olduk ve bunların nasıl hesaplandığını gösterdik. Aynı interface'i implement eden başka bir class'da yapılabilir.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class SphereMatter implements Matter{
  2   public double density=1.0;
  3   public double radius=1.0;
  4   public double getDensity(){
  5     return density;
  6   }
  7   public double getVolume(){
  8     return (3.14 * radius * radius * radius )/3;
  9   }  
 10   public double getMass(){
 11     return density*(3.14 * radius * radius * radius )/3;
 12   }    
 13 }

Görüldüğü gib bu class'da aynı interface implement ediyor. Ancak hacim ve kütle hesaplaması çok değişik.

Absract Class'lar

Bazı methodlarını implement etmiş, bazılarının imlementation'unun kendisini extend eden class'a bırakmış olan class'a abstract class denir. Bu tip class'lar en çok, iki class'ın ortak methodlarından bazılarının implementation'u da aynı olması durumunda kullanılır. Örneğin bir küp için de kütle, hacim ve yoğunluğun çarpımına eşittir, bir küre için de. Ancak yaptığımız iki nesnede de bu ortak özelliği kullanamıyor. Her birisi kütle hesaplamasını kendisi yapılıyor. Matter interface'ini implement eden ne kadar class varsa bu işlem o kadar tekrarlanacak demektir. Bu 'ortak' işlemi bir kere yapıp, hep onun kullanılmasını sağlamak mümkündür.

Ancak çözülmesi gereken bir sorun var : Her class'ın kütlesi aynı şekilde hesaplanıyor bunu hesaplamak için gerekli hacim değerini bilmiyoruz ve her class kendisine göre değişik bir şeklide hesaplıyor. Bu sorun abstract method kullanarak çözülebilir.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 abstract public class Body{
  2   public double density=1.0;
  3   public Body(double d){
  4     density=d;    
  5   }
  6   public double getDensity(){
  7     return density;
  8   }
  9   public double getMass(){
 10     return density*getVolume();
 11   }  
 12   abstract public double getVolume();  
 13 }

Burada abstract bir Body class'ı yarattık. Bu class, hem Cube'ün hem de Sphere'in ortak özelliklerini içermektedir. Zaten density property'si ikisinde de ortaktır. Bu şekilde inherintace yoluyla Cube ve Sphere'a geçebilir. Burada getVolume() method'u abstract bırakılmıştır. Yani implement edilmemiştir. Çünkü volume hesaplamak için her nesne farklı bir method kullanmaktadır. Ancak getMass() implement edilmiştir. Çünkü kütle yoğunlukla hacmin çarpımıdır. Burada object-oriented porgramlama dışındaki bir teknikle asla yapılamayacak bir işlem bulunmaktadır. Bir method (getMass()) henüz yazılmamış bir mehodu (getVolume()'u) kullanarak bir işlem yapabilmektedir. Bu şekilde her cisim için ayrı ayrı hesap yapmaktan kurtulmuş olduk. Şimdi küp ve küre için yeni class'lar yapalım :

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

Görüldüğü gibi bu class kütle hesabını yapan getMass() diye bir method'u yazmak zorunda kalmadı. Çünkü ona miras yoluyla sahip olmuştur. Aşağıdaki gibi kod yazılabilir :

	CubeBody cube=new CubeBody(2.5,10.2);
	double mass=cube.getMass();
	System.out.println("Mass : "+mass);

Aynı şekilde yeni bir küre class'ı yazalım.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class SphereBody extends Body{
  2   public double radius=1.0;
  3   public SphereBody(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 }

Tıpkı küp gibi küre de artık kütle hesabını, hiç bir ek kodlama yapmadan yapabilmektedir.

Hem Extend Hem Implement Etmek

Bir class sadece bir class'ı extend edebilir. Ancak aynı anda bir class'ı extend edip bir veya daha fazla interface'i implement edebilir. Çünkü 'extends' keywordünün aksine, 'implements' demek yoluyla bir class'ın aldığı hiç bir şey yoktur. Sadece bazı method'ları implement etmeyi taahüt etmektedir. Bir Cube class'ı hem Body classını extend edebilir hem de Matter inetrface'ni implement edebilir.

public class Cube extends Body implements Matter{
	// ...
}

Base class'ın bir interface'i imlement etmesi durumda subclass'da etmiş sayılır. Yani

public class Body implements Matter{
	// ...
}

dersek

public class Cube extends Body{
	// ...
}

dememiz yeterlidir. Cube class'ı Matter'i implement etmiş sayılır. Yani implementation'u da miras yoluyla almış demektir.

Interface'in Kullanım Özellikleri

Interface'ler bütün methodları absract olan bir absract class gibi düşünülebilirler. Ancak class'lardan ayrılan başka özellikleri vardır. Ayrıca söylensin veya söylenmesin bütün method ve property'ler public sayılır ve başların proteced veya private gibi anahtar sözcükler alamazlar. Interface'lerde bütün propertyler public, final ve static'tir. O yüzden interface'lerde tanımlanan property'ler bir veya daha fazla class'da kullanılan sabitler için kullanılır.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public interface MathConstants{
  2   double PI=3.14;
  3 }

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class Circle implements MathConstants{
  2   private double radius=1.0;
  3   public getCircumference(){
  4     return 2*PI*radius;    
  5   }
  6 }

görüldüğü Circle classında tanımlanmadığı halde PI değişkeni, sadece MathConstants interface'ini implement ettiği için erişilebilir durumdadır. Bu interface'i implement eden Cylinder adlı bir class'da aynı şekilde PI'a erişebilir. Bu anlamda PI bir sabittir. Ama PI property'si sadece implement edilen class'lar tarafından görülmekte olduğundan global değildir. Zaten Java'da global değişken ve sabit yoktur. Onlara ihtiyaç duyulan yerlerde interface kullanılır. Ancak yine de değişken (dah doğrusu sabit) bir yere (interface) ait olduğundan global olmasından doğacak sakıncalardan kurtulunabilir. Örneğin Math.PI ve GreekLetters.PI yazılabilir, ikisi farklı değerler taşıyabilir.

Dosya Listesi

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