Selamlar.
Bu yazıda sizlere polymorphism (çok biçimlilik) zımbırtısını anlatmaya karar verdim. Özellikle GUI kütüphanelerinde polymorphism çok işe yaramaktadır. Gelin, ne işe yaradığına bakalım.
[CODE lang="cpp" title="Örnek kodumuz"]#include <iostream>
#define PI 3.1415
class Sekil{
public:
virtual float alan() = 0;
virtual float cevre() = 0;
};
class Dikdortgen : public Sekil{
float uzun_kenar, kisa_kenar;
public:
Dikdortgen(float uzun_kenar, float kisa_kenar){
this->uzun_kenar = uzun_kenar;
this->kisa_kenar = kisa_kenar; //this->kisa_kenar = private'taki kisa_kenar değişkenidir.
}
float alan(){
return uzun_kenar*kisa_kenar;
}
float cevre(){
return 2*(uzun_kenar+kisa_kenar);
}
};
class Cember : public Sekil{
private:
float yaricap;
public:
Cember(float yaricap){
this->yaricap = yaricap;
}
float alan(){
return PI*yaricap*yaricap;
}
float cevre(){
return 2*PI*yaricap;
}
};
int main(){
Sekil *sekiller[2];
sekiller[0] = new Cember(5.0);
sekiller[1] = new Dikdortgen(12,6);
for(int i = 0; i < 2; i++){
std::cout<<"Sekil alani : "<<sekiller->alan()<<"\nCevresi : "<<sekiller->cevre()<<"\n";
delete sekiller;
}
return 0;
}[/CODE]
Özellikle main() fonksiyonuna dikkatinizi çekmek istiyorum. main() fonksiyonumuzda, her şekil sınıfını ayrı ayrı yazmak yerine, sadece şekillerin ortak özelliğini kullanmak istedik ve "Sekil" sınıfının bir dizisini yaptık. Ortak özellikler olan alan ve çevre fonksiyonlarımıza erişmiş olduk.
GUI programlamada da, her GUI komponenti aslında birer penceredir. Bastığımız butondan tutun, yazı yazdığınız "metin kutusu" (textbox) bile aslında bir penceredir. Bazen pencere pointer'ı kullanan bir fonksiyona bu komponentlerden birisini parametre olarak geçebilirsiniz, bu sayede sadece pencere sınıfından kalıtılan bilgi ve fonksiyonlar kadar bir bilgiye sahip olursunuz.
[CODE lang="cpp" title="Örnek kod 2 (bu kod derlenemez)"]//...
class ProgressBar : public Window{
ProgressBar(int x, int y) : Window(int x, int y){}
//...
};
void bir_seyler_yap(Window& pencere){/*...*/}
//...
int main(){
ProgressBar progressbar1(100,20);
bir_seyler_yap(progressbar1);
//...
}[/CODE]
Evet, çok biçimlilik bu kadar basit! Farklı iki sınıfın aynı üst sınıfa bağlı olduğunu biliyor ve sadece o üst sınıfın özelliklerini kullanmak istiyorsanız, çok biçimliliğe başvurmalısınız.
Bu yazıda sizlere polymorphism (çok biçimlilik) zımbırtısını anlatmaya karar verdim. Özellikle GUI kütüphanelerinde polymorphism çok işe yaramaktadır. Gelin, ne işe yaradığına bakalım.
[CODE lang="cpp" title="Örnek kodumuz"]#include <iostream>
#define PI 3.1415
class Sekil{
public:
virtual float alan() = 0;
virtual float cevre() = 0;
};
class Dikdortgen : public Sekil{
float uzun_kenar, kisa_kenar;
public:
Dikdortgen(float uzun_kenar, float kisa_kenar){
this->uzun_kenar = uzun_kenar;
this->kisa_kenar = kisa_kenar; //this->kisa_kenar = private'taki kisa_kenar değişkenidir.
}
float alan(){
return uzun_kenar*kisa_kenar;
}
float cevre(){
return 2*(uzun_kenar+kisa_kenar);
}
};
class Cember : public Sekil{
private:
float yaricap;
public:
Cember(float yaricap){
this->yaricap = yaricap;
}
float alan(){
return PI*yaricap*yaricap;
}
float cevre(){
return 2*PI*yaricap;
}
};
int main(){
Sekil *sekiller[2];
sekiller[0] = new Cember(5.0);
sekiller[1] = new Dikdortgen(12,6);
for(int i = 0; i < 2; i++){
std::cout<<"Sekil alani : "<<sekiller->alan()<<"\nCevresi : "<<sekiller->cevre()<<"\n";
delete sekiller;
}
return 0;
}[/CODE]
Özellikle main() fonksiyonuna dikkatinizi çekmek istiyorum. main() fonksiyonumuzda, her şekil sınıfını ayrı ayrı yazmak yerine, sadece şekillerin ortak özelliğini kullanmak istedik ve "Sekil" sınıfının bir dizisini yaptık. Ortak özellikler olan alan ve çevre fonksiyonlarımıza erişmiş olduk.
GUI programlamada da, her GUI komponenti aslında birer penceredir. Bastığımız butondan tutun, yazı yazdığınız "metin kutusu" (textbox) bile aslında bir penceredir. Bazen pencere pointer'ı kullanan bir fonksiyona bu komponentlerden birisini parametre olarak geçebilirsiniz, bu sayede sadece pencere sınıfından kalıtılan bilgi ve fonksiyonlar kadar bir bilgiye sahip olursunuz.
[CODE lang="cpp" title="Örnek kod 2 (bu kod derlenemez)"]//...
class ProgressBar : public Window{
ProgressBar(int x, int y) : Window(int x, int y){}
//...
};
void bir_seyler_yap(Window& pencere){/*...*/}
//...
int main(){
ProgressBar progressbar1(100,20);
bir_seyler_yap(progressbar1);
//...
}[/CODE]
Evet, çok biçimlilik bu kadar basit! Farklı iki sınıfın aynı üst sınıfa bağlı olduğunu biliyor ve sadece o üst sınıfın özelliklerini kullanmak istiyorsanız, çok biçimliliğe başvurmalısınız.