Polimorfizm Nedir?

Polimorfizm Nedir?

Polimorfizm Nedir? Polimorfizm genlerin farklı varyasyonlarını belirtir Her varyasyon benzersiz bir özellik veya karakter yaratır Bu varyasyonlar, canlı organizmaların türleri içindeki çeşitliliğin temel nedenidir Bu yazımızda Polimorfizm nedir ve nasıl oluşur sorularına yanıt vereceğiz Okumak için tıklayın

Polimorfizm Nedir?

Polimorfizm, programlama dillerinde sıkça kullanılan bir kavramdır ve birden fazla anlama gelir. Adından da anlaşılabileceği gibi çokbiçimlilik anlamına gelir. Polimorfizm sayesinde programcılar bir nesneyi farklı şekillerde kullanabilirler. Bu da kod yazımını daha esnek ve özelleştirilebilir hale getirir.

Polimorfizm, programlamanın iki temel şeklinde uygulanabilir: statik polimorfizm ve dinamik polimorfizm. Statik polimorfizm, derleme zamanında belirlenirken, dinamik polimorfizm ise çalışma zamanında gerçekleşir. Her iki polimorfizm türü de programlama alanında önemli bir yere sahiptir ve programcıların kod yazım sürecini kolaylaştırır.


Statik Polimorfizm

Polimorfizm, nesne yönelimli programlama dilinde oldukça önemli bir kavramdır. Polimorfizm, bir objenin farklı şekillerde davranabilme özelliğidir. Bu özellik sayesinde, farklı objeler aynı şekilde davranabilirler. Polimorfizm, iki farklı şekilde gerçekleştirilebilir: Statik Polimorfizm ve Dinamik Polimorfizm.

Statik Polimorfizm, fonksiyonların farklı parametrelerle aynı isim altında kullanılabilmesine olanak tanır. Bu özellik sayesinde, bir fonksiyonun farklı parametrelerle kullanımı sağlanarak, aynı fonksiyon ile farklı işlemler yapılabilir.

Fonksiyon aşırı yüklemesi, aynı isimli farklı fonksiyonların bir arada kullanılabilmesine olanak sağlar. Bu durumda, aynı isimli fonksiyonlar farklı parametre sayıları ve türleri kullanılarak farklı işlevlere sahip olabilirler.

Aynı isimli fonksiyonların kullanımı, programlamada oldukça sık kullanılır. Farklı parametreler kullanılarak aynı isimli fonksiyon farklı işlemler için kullanılır. Örnek olarak, toplama işlemi yapan bir fonksiyon, farklı parametrelerle çarpma veya bölme işlemi yapabilen bir fonksiyon haline getirilebilir.

Operatör aşırı yüklemesi ise, operatörlerin farklı kullanım senaryolarını sağlar. Bu özellik sayesinde, operatörlerin farklı tiplerde değişkenler ile kullanımı sağlanarak, operatörlerin anlamları değişebilir.

Çalışma zamanı polimorfizmi kullanarak, programlama dillerinde şablonlar tanımlanabilir ve kullanılabilir. Bu sayede, dışarıdan farklı değerler gönderilerek aynı fonksiyonu kullanmak mümkündür. Şablonlar, programlama dillerinde oldukça yaygın olarak kullanılan bir olgudur.


Fonksiyon Aşırı Yüklemesi

Fonksiyon aşırı yüklemesi, aynı isimdeki birden fazla fonksiyon tanımlanarak, farklı parametre sayıları ve türleri kullanılarak, farklı işlevler kazandırılmasını sağlayan bir polimorfizm çeşididir.

Bu sayede, programcıların aynı fonksiyon ismiyle farklı girdileri kullanarak farklı işlemler yapması mümkün hale gelir. Fonksiyonun adı ve parametreleri farklı olduğundan program performansı, verimliliği ve kod tekrarı azalır.

Fonksiyon aşırı yüklemesi özellikle C++ dilinde kullanılır. C++ dilinde, bir sınıf içinde birden fazla fonksiyonu aşırı yükleyebilirsiniz; bu, aynı isimle birden fazla fonksiyon tanımlanmasına izin veren tek dildir.

  • Aşırı yüklenmiş fonksiyonlarda, farklı sayıda argüman dışında fonksiyonların imzaları aynıdır.
  • Aynı isimli fonksiyonların işlevlerini geliştirmek, kod verimliliğini artırmak için de kullanılır.

Aynı İsimli Fonksiyonların Kullanımı

Polimorfizm, aynı isme sahip farklı fonksiyonlar oluşturulmasına izin verir. Bu, programcıların aynı işlevleri farklı durumlarda kullanabilmesine olanak sağlar. Bir işlev aşırı yüklendiğinde, aynı isimde farklı parametreleri olan birden fazla işlev oluşturulabilir.

Örneğin, bir "hesapla" işlevi aynı anda toplama ve çıkarma işlemlerini yapabilir. İşlevin ikinci parametresinin türüne bağlı olarak, işlev toplama veya çıkarma işlemini gerçekleştirebilir.

İşlev Adı Parametre 1 Parametre 2 Örnek Çıktı
hesapla int int toplama işlemi sonucu
hesapla double double çıkarma işlemi sonucu

Yukarıdaki örnekte, "hesapla" işlevi aynı isimde iki farklı parametre listesi kullanarak farklı işlevlere sahip olabilir.


Operatör Aşırı Yüklemesi

Operatör aşırı yüklemesi, operatörlerin farklı kullanım senaryoları için kullanılan bir polimorfizm türüdür. Bu kullanım senaryoları, özellikle sınıf tipi verilerin kullanıldığı durumlarda oldukça işlevseldir. Operatör aşırı yüklemesi ile bütünsel veri tipleriyle işlem yapılırken, farklı kullanım senaryolarına sahip olmak mümkün olacaktır.

Bu tür polimorfizm, sınıf tipindeki verilerin fonksiyonlarının aşırı yüklenmesi ve operatörlerin aşırı yüklenmesiyle oluşturulur. Böylece, sınıf tipi değişkenlerin işleyişinde operatörlerin kullanımı daha esnek hale getirilir.

Operatör aşırı yüklemesi ile kullanabileceğiniz operatörler şöyle sıralanır:

  • Atama operatörü (=)
  • Aritmetik operatörler (+, -, *, /)
  • İlişkisel operatörler (==, !=, <, >, <=, >=)
  • Bit düzeyi operatörler (&, |, ^, ~, <<, >>)
  • Mantıksal operatörler (!, &&, ||)
  • Yan etkisiz fonksiyon çağırmaları (, )

Operatör aşırı yüklemesi, programlama dili öğrenenler için biraz karmaşık görünebilir. Ancak, kullanıldığında oldukça işlevseldir ve kodun daha okunaklı ve anlaşılır olmasına yardımcı olabilir.


Şablonlar Kullanarak Polimorfizm

Şablonlar, çalışma zamanı polimorfizmini kullanarak veri türlerini parametre olarak alan farklı fonksiyonların tek bir kod bloğu içinde tanımlanabilmesine olanak tanır. Şablonlar, farklı veri türleri için aynı işlemleri yapmak istediğimizde oldukça kullanışlıdır.

Şablonlar, kod tekrarını azaltmaya yardımcı olan fonksiyon şablonları olarak tanımlanabilir. Bu sayede, işlemlerinizi hızlandırabilirsiniz. Örneğin, bir tane sayısal diziyi büyükten küçüğe, bir tane de alfabetik olarak sıralamak istediğinizi varsayalım. Bu durumda, iki farklı sıralama fonksiyonu yazmanız gerekir. Fakat şablon kullanarak, her iki durumda da tek bir sıralama fonksiyonu yazılır. Bu sayede, kod tekrarını azaltarak uygulamayı daha okunaklı ve anlaşılır hale getirirsiniz.

Şablonlar ayrıca genişletilebilirliği sağlamak için kullanılır. Bir şablon sınıfı tanımlayarak, farklı üyelerde farklı veri türlerini kullanabilirsiniz. Bu sayede, sınıfın genel performansını artırabilirsiniz.

Şablonların kullanımı, tasarımın genişletilebilirliği de sağlar. Polimorfizm ile geliştirilen uygulamalar, uygulamanın daha esnek ve açık olmasını sağlar. Bu sayede, uygulamaların daha yenilikçi olmasını ve kişiselleştirilebilmesini sağlar.

Bir şablon tanımlarken, fonksiyonun amaç ve parametreleri tanımlanmalıdır. Şablon, sınırlı sayıda parametre gönderilebileceği gibi istenilen veri türünü kullanarak oluşturulabilir. Şablon, programın farklı alanlarında sıklıkla kullanılabilir ve uygulamanın tasarımını önemli ölçüde etkileyebilir.

Sonuç olarak, şablonlar programlama dillerinde polimorfizmi kullanarak kodun okunabilirliğini artıran ve genişletilebilirliğini sağlayan önemli araçlardır. Uygulamanın esnekliğini sağlamak ve uygulamayı iyileştirmek için şablonların kullanılması önerilir.


Dinamik Polimorfizm

Dinamik polimorfizm, çalışma zamanında belirlenen bir yöntem çağrısıdır. Bu tür polimorfizm, sanal fonksiyonlar ve saf sanal fonksiyonları kullanarak gerçekleştirilebilir.

Sanal Fonksiyonlar
Sanal fonksiyonlar, herhangi bir sınıfın içinde tanımlanabilecek ve anlamı alt sınıflara bırakacak şekilde işaretlenebilecek fonksiyonlardır. Bu tür fonksiyonlar, bir üst sınıfın içinde tanımlansa bile, alt sınıflar tarafından yeniden tanımlanabilir. Alt sınıfların ayrıca, üst sınıflarda tanımlanan aynı isimli fonksiyonlara erişimi de vardır. Bu sayede alt sınıfların işlevselliği, üst sınıflardan farklı hale getirilebilir.

Çokbiçimlilik Kavramı
Çokbiçimlilik, sanal fonksiyonların kullanımı ile gerçekleştirilen bir polimorfizm türüdür. Bu anlamda, alt sınıfların, üst sınıflarda tanımlanmış olan bir sanal fonksiyona farklı bir şekilde davranmasına izin verilir. Bu durum, alt sınıfların farklı amaçlara hizmet etmesine olanak tanır.

Saf Sanal Fonksiyonlar
Saf sanal fonksiyonlar, tamamen sanal fonksiyonlardan oluşur. Hiçbir işlevsellik içermediği için, alt sınıflar tarafından yeniden tanımlandığında, tamamen yeni bir işlevsellik kazandırırlar. Bu sayede, alt sınıflar, tamamen farklı işlevlere hizmet edebilirler.

Özetle, dinamik polimorfizm, çalışma zamanında gerçekleşen bir polimorfizm türüdür. Sanal fonksiyonlar ve saf sanal fonksiyonlar, alt sınıfların, üst sınıflarda tanımlanmış olan fonksiyonlara yeni işlevler kazandırmasına olanak tanırlar. Bu durum, bir sistemin genişletilmesi ve yeniden kullanılması açısından büyük avantajlar sağlar.


Sanal Fonksiyonlar

Sanal fonksiyonlar, polimorfizmin temel bileşenlerinden biridir. Bir ana sınıftaki sanal fonksiyonlar türetilmiş sınıflar tarafından yeniden tanımlanabilir (override edilebilir). Bu, aynı isme sahip farklı fonksiyonların farklı işlemleri gerçekleştirmeleri nedeniyle, ayrıca çokbiçimlilik olarak adlandırılır. Sanal fonksiyonlar, türetilmiş sınıfların ana sınıflardan miras aldığı öznitelik ve işlevlerin sınıf özelliklerini geçersiz kılmalarını sağlar.

Sanal fonksiyonlar, bir sınıfın temel işlevselliği için üst sınıftan yerel bir yöntem çağırmak ve ardından yerel bir uygulama işlemleri gerçekleştirerek, farklı işlevlerin yerine getirilmesine izin verir. Sanal fonksiyonların temel amacı, hizmetlerin sınıflandırılmasını daha basit ve anlaşılır hale getirerek programlamayı daha verimli hale getirmektir.

Sanal fonksiyonlar, sınıf yöntemlerinin genellikle küçük bir alt kümesidir. Bu, sanal fonksiyonların daha az bilgi alması ve daha az işlem yapması gerektiği anlamına gelir. Sanal fonksiyon kullanımı, başka bir sınıfın özelliklerini kullanan bir sınıfın dizaynını kolaylaştırır. Bununla birlikte, sanal fonksiyonlar, kod maliyetlerinin artması nedeniyle, programlama dillerinde tercih edilmeyebilir.

Sanal fonksiyonlar, işlemlerinin normal işlemlerden daha yavaş olması nedeniyle performans kaybına neden olabilir. Çoğu zaman, sanal fonksiyonların anlatıldığı birçok kaynakta, sınıftaki işlevleri hızlandırmak için bir yöntem olarak kullanılabilen saf sanal fonksiyonlar da belirtilir. Ancak, saf sanal fonksiyonlar kullanılmadan önce, bir programın tasarım hedeflerine uygun olup olmadığı dikkatlice değerlendirilmelidir.


Çokbiçimlilik Kavramı

Çokbiçimlilik kavramı, bir nesnenin farklı şekillerde davranabileceği une karşılık gelmektedir. C++ dilinde, bu kavram sıklıkla sanal fonksiyonlar ile kullanılmaktadır. Sanal fonksiyonlar, türetilmiş sınıflardaki davranışları değiştirmek için kullanılır. Çokbiçimlilik, kalıtımın en önemli özelliklerinden biridir ve nesne yönelimli programlamada oldukça sık kullanılır.

Bir sınıfın metodları, alt sınıflar tarafından yeniden tanımlanabilir. Bu şekilde, aynı sınıftan oluşan bir grup farklı nesne, aynı yöntemi farklı şekilde kullanabilir. Bu, çokbiçimliliğin bir örneğidir. Sanal fonksiyonlar, aynı isimdeki fonksiyonların farklı şekillerde kullanımına olanak sağlayan mekanizmalardır ve bu nedenle, çokbiçimliliğin önemli bir parçasıdır.

Sanal fonksiyonlar, ebeveyn sınıfta tanımlanır ve çocuk sınıfta aynı isimle veya özgün bir isimle yeniden tanımlanır. Bu durumda, çocuk sınıfındaki fonksiyon, süper sınıftaki fonksiyonun yerine geçer. Bu, alt sınıfın davranışını değiştirmesine izin verir. Çokbiçimlilik, kodun yeniden kullanılabilirliğini artırır ve aynı zamanda bakımı da kolaylaştırır.

Örneğin, bir çizgi ve bir daire oluşturan iki sınıfımız var. Her iki sınıfın da alan hesaplama yöntemi vardır. İki yöntem de aynı ismi kullanır. Eğer bu yöntemleri çok biçimli hale getirirsek, hem çizgi hem de daire sınıfı aynı yöntemi kullanabilir ve her biri için farklı bir alan hesaplama yöntemi uygulanabilir.

Çokbiçimlilik, nesne yönelimli programlama tekniklerinde oldukça önemlidir. Sanal fonksiyonlar, nesnelerin farklı bahşedilebileceği ve kalıtımdan en iyi şekilde yararlanabileceği durumlar yaratır. Bu sayede, kodun okunabilirliği, yeniden kullanılabilirliği ve bakımı daha kolay hale gelir.


Saf Sanal Fonksiyonlar

Saf sanal fonksiyonlar, tüm alt sınıflardan aynı imzayı kullanarak farklı uygulamalar destekleyen sanal fonksiyonlardır. Saf sanal fonksiyonlar, hiçbir implementasyona sahip olmayan sanal fonksiyonlardır. Bu nedenle, işlevin implementasyonu, altsınıflarda tanımlandıklarında mümkün hale gelir.

Saf sanal fonksiyonlar, C++ programlama dilinde, sınıfların miras alınması sürecinde oldukça önemlidir. Miras alan sınıf, baz sınıfta tanımlanmış olan sanal fonksiyonları ezebilir. Böylece, saf sanal fonksiyonlar oluşturularak alt sınıflarda kullanılabilir. Bu sayede, miras veren sınıfta o fonksiyonun implementasyonunu yapmak zorunda kalınmaz ve alt sınıflarda farklı işlevler yerine getirilebilir.

Saf sanal fonksiyonların kullanımı, C++ programlama dilinde tasarım desenlerinde de oldukça yararlıdır. Bu fonksiyonlar ile birlikte, bir 'Template Method Design Pattern' kullanılabilir. Bu desen kullanılarak, programlama yaparken kodun yeniden kullanılabilirliği artırılabilir ve kodun daha modüler bir yapıya sahip olması sağlanabilir.

Özet olarak, saf sanal fonksiyonlar, C++ programlama dilinde, altsınıflarda farklı işlevlerin yerine getirilmesi amacıyla kullanılan sanal fonksiyonlardır. Bu fonksiyonlar, tasarım desenlerinde de önemli bir yere sahiptir.


Polimorfizmin Avantajları

Polimorfizmin avantajları, onun yazılım tasarımında sağladığı genişletilebilirlik ve bakım kolaylığıdır.

Polimorfizm, sadece bir kod parçası kullanarak farklı işlevlerin gerçekleştirilmesine olanak tanır. Bu, kodun daha az olmasını ve yazılımın genişletilmesini ve bakımını kolaylaştırır. Özellikle büyük yazılımlarda, birçok bileşen birbirleriyle etkileşim halindedir ve polimorfizm kullanımı, bunların daha etkili ve verimli bir şekilde çalışmasını sağlar.

Bir başka avantajı ise, bir uygulamanın istenirse birden fazla formatta veri depolama ve işleme yapabilmesidir. Bu, özellikle internet uygulamaları gibi farklı platformlarda kullanımı birden fazla olan yazılımlar için önemlidir.

Bununla birlikte, yazılımların genişletilebilirliği, birçok bileşenin birbirine bağımlı olduğu yerlerde önemlidir. Bu bağımlılıklara uygun bir şekilde tasarlanan polimorfik sınıflar, yazılımın bakımını kolaylaştırır ve sistemdeki başka bir bileşene zarar vermeden bir bileşeni değiştirme ya da yeniden yazma olasılığını artırır.

Tasarımların kolayca değiştirilebilmesi ve yazılımın genişletilebilirliği, günümüzde yazılım endüstrisinde oldukça önemlidir. Doğru kullanıldığında, polimorfizm, yazılımın daha esnek ve çevik olmasını sağlar ve tüm bunlar yazılım tasarımına pozitif katkıda bulunur.


Örnek Kod Parçaları

Statik polimorfizm ve dinamik polimorfizm örnek kodları ile bu kavramları daha iyi anlayabilirsiniz.

Aşağıdaki örnek kod, statik polimorfizmin kullanımını göstermektedir. Basit bir Matematik sınıfı tanımlıyoruz ve bu sınıfta yer alan iki farklı fonksiyonu aynı isimde kullanıyoruz. Farklı parametre sayıları ile birlikte çağrılan bu fonksiyonlar, polimorfik davranış sergilemektedir.

```#includeusing namespace std;

class Matematik{ public: void islemYap(int x, int y){ cout << "Toplam: " << x + y << endl; } void islemYap(int x, int y, int z){ cout << "Çarpım: " << x * y * z << endl; }};

int main(){ Matematik m; m.islemYap(2, 3); m.islemYap(2, 3, 5); return 0;}```

Aşağıdaki örnek kod, dinamik polimorfizmin kullanımını ve sanal fonksiyonların tanımını göstermektedir. Hayvan sınıfımızı tanımlıyoruz ve bu sınıftan türeyen iki farklı alt sınıfımızı da tanımlıyoruz. Bu alt sınıflar, kendilerine özgü bir özellik taşıdıkları için sanal fonksiyon olarak belirtiliyorlar. Ana programda ise farklı alt sınıflardan türetilmiş objeler oluşturularak bu özellikler kullanılıyor.

```#includeusing namespace std;

class Hayvan{ public: virtual void beslen(){ cout << "Hayvan Beslendi" << endl; }};

class Kedi : public Hayvan{ public: void beslen(){ cout << "Kedi Süt İçti" << endl; }};

class Köpek : public Hayvan{ public: void beslen(){ cout << "Köpek Mama Yedi" << endl; }};

int main(){ Hayvan *h; Kedi k; Köpek kp; h = &k; h->beslen(); h = &kp; h->beslen(); return 0;}```

Bu örnek kodlarla, polimorfizm kavramına dair farklı senaryolar gözlemlenebilir ve bu sayede daha iyi anlaşılabilir.