Yazan : Şadi Evren ŞEKER

C++ programlama dili, nesne yönelimli olmasından dolayı çok şekillilik (polymorphism) özelliğini destekler. Çok şekillilik (polymorphism) bir işin farklı şekillerle yapılabilmesidir. Örneğin bir metodun farklı şekillerde çağrılabilmesi, çok şekillik özelliği ile mümkündür. Bu yazıda, metotların ve işlemlerin (operators) üzerine yüklenmesi (overloading) anlatılacaktır.

Amacımız bir fonksiyonu farklı şekillerde çalıştırabilmektir. Nesne yönelimli özelliği olmayan dillerde, bir fonksiyon tek bir isimle bir kere tanımlanabilir. Örneğin aşağıdaki dikdörtgenin alanını hesaplayan fonksiyonu ele alalım:

int alan(int a, int b){
   return a*b;
}

Yukarıdaki fonksiyon gayet başarılı bir şekilde a ve b kenarları verilen dikdörtgenin alanını hesaplar. Ancak aynı alan hesabını örneğin float sayılar için düzenlemek istesek ve verilen değere göre çalışmasını istesek:

float alan (float a, float b){
   return a*b;
}

Şeklinde yazılan fonksiyon, aldığı parametreler itibariyle, farklı bir fonksiyon iken, nesne yönelimli özelliği bulunmayan dillerde, bu iki fonksiyonu aynı anda kodlamamız mümkün olmaz.

Benzer şekilde, her kare bir dikdörtgendir mantığıyla, tek kenar uzunluğu verildiğinde alan hesaplamak istersek

int alan(int a){
   return a*a;
}

Fonksiyonu, bir karenin alanını başarılı bir şekilde hesaplayabilrken, daha önceden tanımlı olan fonksiyonlarla çakışmaktadır.

C++, JAVA veya CSharp gibi diller için yukarıdaki bütün bu fonksiyon tanımları farklı anlama gelmektedir ve tek bir sınıf (class) içerisinde tanımlanabilir. Örneğin aşağıdaki C++ sınıfını ele alalım

class dikdörtgen{
 public:
   int a,b;
 public:
   int alan(int a,int b);
   float alan(float a,float b);
   int alan(int a);
};

Yukarıdaki bu tanımlama, C++ dili açısından problemsiz bir tanımdır ve hangi alan fonksiyonunun çalıştırılacağı, verilen parametrelere göre algılanır.

Örneğin yukarıdaki tanımlardan sonra aşağıdaki main fonksiyonunu yazarsak:

int main(){
   dikdörtgen *d = new dikdörtgen();
   cout << d->alan(3,4) << endl << d->alan(2.2,7.8) << endl << alan(5) << endl;
}

Yukarıdaki kod, sorunsuz bir şekilde üç ayrı fonksiyonu çağırarak çalıştırır.

Yukarıdaki örnekte yapılan işlem, alan isimli fonksiyonun üzerine yüklenmesidir (overloading). Yani aynı isme sahip birden fazla fonksiyon tanımlanmış ve bu fonksiyonların parametre tipleri veya parametre sayılarına göre farklı durumlar için yeniden kodlanmıştır. Bu anlamda üzerine yükleme işlemi bir çok şekillilik işlemidir (polymorphism) ve aynı işi yapan birden fazla şekilde çalışmaya izin verir.

Üzerine yükleme işlemi, fonksiyonların yapıcıları (constructors) için de kullanılabilir. Örneğin dikdörtgen tanımı sırasında farklı bilgiler ile bir dikdörtgenin tanımlanacağını düşünelim.

  • Dikdörtgen hakkında hiçbir bilgi vermeyebiliriz
  • Dikdörtgenin kenarlarını verebiliriz
  • Dikdörtgenimiz özel olarak bir kare olabilir ve tek kenarını verebiliriz.

Yukarıdaki bu üç farklı durum için, dikdörtgen tanımını değiştirmemiz gerekir. Bu durumda olası, yapıcı fonksiyonlarımız (constructors) aşağıdaki şekilde olabilir :

public:

dikdörtgen(){
   a=0;b=0;
}
dikdörtgen(int a){
   this->a = a; b= 0;
}
dikdörtgen(int a,int b){
   this->a=a;
   this->b=b;
}

Benzer bir üzerine yükleme işlemi de, işlemler (operators) için yapılabilir. İşlem üzerine yükleme (operatör overloading) için bağlantıdaki yazıyı okuyabilirsiniz .

Bir cevap yazın

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