Şablon Metot ve Sınıflar, Java ve C++’ın Şablonlara Bakış Açıları

Bir metot düşünün aldığı her türden veriyi sıralayabiliyor. Normal şartlarda metodun aldığı parametrenin türü ne ise çağrıldığında o türden bir değer gönderilebilir. Fakat şablon (generic) yapılarla türden bağımsız metot ve sınıflar yazılabilir. Örneğin aşağıdaki C++ kod bloğunda Kabarcık Sıralama (Bubble Sort) kullanılarak tam sayılar sıralanmaktadır. Fakat bu sadece tam sayıları sıralayabilir. Bunu herhangi türden değerleri sıralamasını sağlayabilmek için şablon metoda çevrilmesi gerekir.

 

void Sirala(int dizi[],int uzunluk){
    for(int i=0; i<uzunluk; i++) { for(int j=uzunluk-1; j>i; j--)
      {
        if(dizi[j-1]>dizi[j])
        {
          int yedek=dizi[j-1];
          dizi[j-1]=dizi[j];
          dizi[j]=yedek;
        }
      }
    }
}

Şablon metodu C++ dilinde gerçekleştirebilmek için template kelimesi kullanılır. Bu şeklinde tanımlandığı zaman Tur isminde aslında yeni bir tür tanımlanmış olur ve bu sayede metot çağrıldığında çağrılma anında tür belirtilebilmektedir. Yukarıdaki aynı kod şablon metoda çevrildiği zaman aşağıdaki yapı oluşacaktır.

template 
void Sirala(Tur dizi[],int uzunluk){
 for(int i=0; i<uzunluk; i++) { for(int j=uzunluk-1; j>i; j--)
      {

        if(dizi[j-1]>dizi[j])
        {
          Tur yedek=dizi[j-1];
          dizi[j-1]=dizi[j];
          dizi[j]=yedek;
        }
      }
    }	
}

Yazılmış olan şablon Sirala metodunu aşağıdaki gibi farklı türden diziler göndererek test edebiliriz. Program derlenip çalıştırıldığında her ikisinin de aynı metot yardımıyla sıralanabildiği görülecektir.

int main(){
	string d[]={"agb","hjk","btkl","jlkh","crty","yeeb"};

	Sirala(d,6);
	for(int i=0;i<6;i++){
		cout<<d[i]<<" ";
	}
	cout<<endl<<endl;

	int dc[]={16,5,84,3,1,27};

	Sirala(dc,6);
	for(int i=0;i<6;i++){
		cout<<dc[i]<<" ";
	}
	cout<<endl;

	return 0;
}

Şablon metotlar Java dilinde de uygulanabilir. Fakat Java dilinde ilkel türler şablon metotlara parametre olarak gönderilemez. Referans tür dediğimiz sınıf nesneleri gönderilebilir. Örneğin aşağıdaki Java koduna bakıldığında şablon metot sınıf içinde tanımlanmıştır.

public class Dene{
    public static  boolean Ara(Tur dizi[],Tur aranan){
        for (Tur eleman : dizi) {
            if (eleman.equals(aranan)) {
                return true;
            }

        }
        return false;

    }   

    public static void main(String[] args) {
        String d[]={"agb","hjk","btkl","jlkh","crty","yeeb"};

        if(Ara(d,"yeeb")) System.out.println("Aranan kelime var.");
        else System.out.println("Aranan kelime yok.");
		Integer dc[] = {16,5,84,3,1,27};

        if(Ara(dc,39)) System.out.println("Aranan sayı var.");
        else System.out.println("Aranan sayı yok.");
    }   
}

Arama işleminin yapıldığı Ara metodu herhangi türden bir dizi içerisinde arama yapabilmektedir. main metodu içerisinde bu test edilmiş ve string ile tam sayı dizileri içerisinde eleman araması aynı metot kullanılarak yapılmıştır. Dikkate edilmesi gereken int yerine Integer tanımlanmış ilkel tür yerine tam sayı sınıfı kullanılmıştır.
Şablon metot tanımlanabildiği gibi şablon sınıf ta C++ ve Java dilinde tanımlanabilmektedir. Örneğin bir kutu sınıfı içerisinde herhangi türden bir nesne içerebilir. Bu durumda Kutu sınıfı şablon olarak tasarlanmalıdır.

template 
class Kutu{

	private:
		Tur esya;

	public:
		Kutu(Tur esya){
			this->esya = esya;
		}
		friend ostream& operator<<(ostream& ekran, Kutu &sag){
			ekran<<sag.esya<<endl;
			return ekran;
		}
};

Metot üzerine yazılan template ifadesi sınıfın üzerine yazılır. Bu şekilde ilgili sınıfın şablon sınıf olduğunu bildirmiş oluruz. Bu sınıfın yaptığı içerisinde herhangi türden bir nesne saklayıp nesnenin içeriğini ekrana yazdırabilmektedir. Aşağıda kutu içerisinde saklanabilecek Meyve isimli bir sınıf tasarlanmıştır.

class Meyve{

	private:
		string renk;
		string cesit;

	public:

		Meyve(){

			renk="";
			cesit="";
		}

		Meyve(string rnk, string cst){
			renk=rnk;
			cesit=cst;
		}
		friend ostream& operator<<(ostream& ekran, Meyve &sag){
			ekran<<sag.renk<<" "<<sag.cesit<<endl;
			return ekran;
		}

};

Meyve sınıfı hangi meyve olduğu cesit isimli değişkende ve renginin ne olduğu ise renk isimli değişkende tutmaktadır. Ve Meyve nesnesi ekrana yazdırıldığında bu bilgiler ekrana yazdırılmaktadır. Aşağıda Kutu sınıfı test eden main metodunu görüyoruz. İlk önce içerisinde int tutabilecek bir Kutu nesnesi tanımlanmış ve 500 değeri içerisine konulmuştur. Ekrana yazdırılan kutu nesnesi 500 değerini ekrana yazacaktır. Daha sonra aynı Kutu sınıfı kullanılıp başka bir nesne oluşturulmuş ve bu nesne içerisinde Meyve nesnesi tutabilecek şekilde ayarlanmıştır. Ekrana yazdırılan bu yeni kutu nesnesi ekrana Kirmizi Elma yazmaktadır.

int main(){
	Kutu *kutu = new Kutu(500);
	cout<<*kutu<<endl;
	
	Meyve *m = new Meyve("Kirmizi","Elma");
	
	Kutu *digerKutu = new Kutu(*m);
	cout<<*digerKutu<<endl;
	
	delete kutu;
	delete digerKutu;
	delete m;
	return 0;
}

Bu şekilde aynı Kutu sınıfı kullanılarak farklı türden nesneler ile işlem yapılabilmektedir. Bu Kutu sınıfına şablon sınıf ismi verilmektedir.
Aynı örnek Java dilinde yapılmaya çalışıldığında ilk önce Kutu sınıfı yazılır. Java dilinde nesnenin ekrana yazılması toString metodunun sınıf içerisinde tekrar tanımlanması ile olmaktadır.

public class Kutu {
    private Tur esya;
    public Kutu(Tur esya){
        this.esya = esya;
    }	

    @Override
    public String toString() {
        return esya.toString() + "\n";	
    }   
}

Daha sonra Meyve sınıfı yazılır. Neredeyse C++ dili ile aynıdır bu kısım.

public class Meyve {
    private String renk;
    private String cesit;

    public Meyve(){
        renk="";
        cesit="";
    }
    public Meyve(String rnk, String cst){
		renk=rnk;
		cesit=cst;
    }
	
    @Override
    public String toString() {
        return renk + " " + cesit + "\n";
    }
}

Bu örneğin Java dilinde test edilmesi için içerisinde main metodu olan ana sınıf yazılır. Burada C++ dilinden biraz daha farklı bir kullanım görülmektedir. C++’a benzer de kullanıldığında Java hata vermez fakat daha doğru olan kullanım aşağıdaki gibidir. Şablon sınıf olan Kutu sınıfından bir nesne türetildiğinde hangi türden olduğu ilk kısımda verilirken ikinci kısım boş geçilir ve derleyiciye bunun ayarlaması bırakılır. Bu işleme Diamond denir.

public class Dene{
    public static void main(String[] args) {
        Integer a= 500;

        Kutu kutu = new Kutu<>(a);
        System.out.println(kutu);
		
        Meyve m = new Meyve("Kirmizi","Elma");
        Kutu digerKutu = new Kutu<>(m);
        System.out.println(digerKutu);
    }  
}

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir