Şimdi yaptığımız kedigiller sınıfını örnek alalım.
Kedigiller base sınıftı demi? Her şey onu miras alıyordu ve Kedigiller tek başına bize bir şeyi temsil etmiyordu.
Kedigiller çünkü çoğul biz onu nesne olarak alıp kullanmamız mantıklı değil bunun yerine onu miras alan kedi/aslan/çita sınıflarını kullanmak daha mantıklı.
Biz kedigiller sınıfını hepsini bir arada kullanabileceğimiz (polymorphism) için arayüz olarak kullanmıştık. (Kafanız birazcık karıştı biliyorum ama sakin ol.)
Şimdi bir şekilleri sınıflandırıcağımız bir sınıf oluşturucağımızı düşünelim. (Kare/Dikdörtgen/Daire vb.). Bunlarım ana özellikleri nelerdir?
O zaman bunların hepsin de bir
int alan;
int çevre;
Yazamayız mantılı değil çünkü inheritance diye bir şey öğrendik. Ancak her bir şekilin kendine göre
Özellikleri var. Mesela dairenin kenarı yok yarı çapı var gibi. Bu yüzden nasıl bir Class şeması çıkartabiliriz?
Hadi o zaman yapalım.
#include <iostream>
class Sekiller{
protected:
int alan;
int cevre;
public:
virtual void whoAmI(void){
std::cout << "Ben Base Sekillerim" << std::endl;
}
};
class Dikdörtgen : public Sekiller{
public:
void whoAmI(void){
std::cout << "Ben Dikdörtgenim." << std::endl;
}
};
class Daire : public Sekiller{
public:
};
int main(){
Sekiller *b[3];
b[0] = new Sekiller();
b[1] = new Dikdörtgen();
b[2] = new Daire();
b[0]->whoAmI();
b[1]->whoAmI();
b[2]->whoAmI();
}
Şimdi burada gördüğünüz gibi daire haricinde hepsinin kendinin hangi şekil olduğunu söyleyen bir method var.
Böyle bir durumda Daire sınıfı şekiller sınıfının whoAmI methodunu kullanır. Bu da burada yanlış bir durumdur. Şimdi burada eğer bir sınıfı bu şekilde hepsinde olmasını istediğimiz özellikleri topluyorsak bu sınıfı abstract class yaparız. Gelin Sekiller sınıfını abstract bir sınıf yapalım.
class Sekiller{
protected:
int alan;
int cevre;
public:
virtual void whoAmI(void) = 0; //pure method olarak da adlandırılır.
};
O sınfa ait hanallaştırılmış erhangi bir methodun gövdesini silip “=0” yazarsak bu sınıf artık abstract sınıf olarak geçmeye başlar.