??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); } }