İçeriğe atla

Çokbiçimlilik

Çokbiçimlilik (İngilizcepolymorphism), bir türün bir başka tür gibi davranabilme ve bu tür gibi kullanılabilme özelliğidir. Nesne yönelimli programlama dillerinde çokbiçimlilik özelliği ise aynı temel sınıftan türetilmiş olan sınıflarda paylaşılan, başka bir ifadeyle aşırı yüklenen aynı metodun bu sınıflarda farklı şekillerde uyarlanabilmesidir. Nesnenin davranışı çalışma anında belirlendiği için programcılar, çokbiçimlilik özelliği sayesinde nesnelerin türünü önceden bilmek zorunda kalmaz.

Örnekler

C++

#include <string>
#include <type_traits>
#include <iostream>

struct Animal {
  virtual ~Animal() = default;

  virtual std::string talk() const = 0;
};

struct Cat : public Animal {
  std::string talk() const override { return "Miyav!"; }
};

struct Dog : public Animal {
  std::string talk() const override { return "Hav! Hav!"; }
};

static_assert(std::is_polymorphic_v<Animal>);
static_assert(std::is_base_of_v<Animal, Cat>);
static_assert(std::is_base_of_v<Animal, Dog>);

std::string talk(const Animal& a) {
  return a.talk();
}

int main() {
  Cat minnos;
  Dog karabas;

  std::cout << talk(minnos) << '\n';  // Miyav!
  std::cout << talk(karabas) << '\n'; // Hav! Hav!
}
// C++17 ve sonrasi std::variant tipi kullanarak
// https://en.cppreference.com/w/cpp/utility/variant
#include <string>
#include <variant>
#include <iostream>

struct Cat {
  std::string talk() const { return "Miyav!"; }
};

struct Dog {
  std::string talk() const { return "Hav! Hav!"; }
};

using Animal = std::variant<Cat, Dog>;

std::string talk(const Animal& a) {
  struct v {
    std::string operator()(const Cat& c) const { return c.talk(); }
    std::string operator()(const Dog& d) const { return d.talk(); }
  };

  return std::visit(v{}, a);
}

int main() {
  Cat minnos;
  Dog karabas;

  std::cout << talk(minnos) << '\n';  // Miyav!
  std::cout << talk(karabas) << '\n'; // Hav! Hav!
}
// C++17 ve sonrasi std::any tipi kullanarak:
// https://en.cppreference.com/w/cpp/utility/any
#include <string>
#include <any>
#include <iostream>

struct Cat {
  std::string talk() const { return "Miyav!"; }
};

struct Dog {
  std::string talk() const { return "Hav! Hav!"; }
};

std::string talk(const std::any &animal) {
  if (const Cat *c = std::any_cast<Cat>(&animal))
    return c->talk();

  else if (const Dog *d = std::any_cast<Dog>(&animal))
    return d->talk();

  return std::string{};
}

int main() {
  Cat minnos;
  Dog karabas;

  std::cout << talk(minnos) << '\n';  // Miyav!
  std::cout << talk(karabas) << '\n'; // Hav! Hav!
}
// C++20 auto fonksiyon parametresi kullanarak
#include <string>
#include <iostream>

struct Cat {
  std::string talk() const { return "Miyav!"; }
};

struct Dog {
  std::string talk() const { return "Hav! Hav!"; }
};

std::string talk(const auto &animal) {
  return animal.talk();
}

int main() {
  Cat minnos;
  Dog karabas;

  std::cout << talk(minnos) << '\n';  // Miyav!
  std::cout << talk(karabas) << '\n'; // Hav! Hav!
}
// C++20 concept ile türü belli üye fonksiyona sahip olacak şekilde kısıtlayarak
// https://en.cppreference.com/w/cpp/language/constraints
#include <string>
#include <iostream>
#include <concepts>

template <typename T>
concept Talkable = requires(T t) {
  { t.talk() } -> std::same_as<std::string>;
};

struct Cat {
  std::string talk() const { return "Miyav!"; }
};

struct Dog {
  std::string talk() const { return "Hav! Hav!"; }
};

std::string talk(const Talkable auto &animal) {
  return animal.talk();
}

int main() {
  Cat minnos;
  Dog karabas;

  std::cout << talk(minnos) << '\n';  // Miyav!
  std::cout << talk(karabas) << '\n'; // Hav! Hav!
}

Java

interface IAnimal {
  String talk();
}

class Cat implements IAnimal {
  public String talk() { return "Miyav!"; }
}

class Dog implements IAnimal {
  public String talk() { return "Hav! Hav!"; }
}

public class Test {
  public static void main(String[] args) {
    IAnimal cat = new Cat();
    IAnimal dog = new Dog();

    System.out.println(cat.talk()); // Miyav!
    System.out.println(dog.talk()); // Hav! Hav!
  }
}

Kaynakça

İlgili Araştırma Makaleleri

<span class="mw-page-title-main">C (programlama dili)</span> programlama dili

C, yapısal bir programlama dilidir. Bell Laboratuvarları'nda, Ken Thompson ve Dennis Ritchie tarafından UNIX işletim sistemini geliştirebilmek amacıyla B dilinden türetilmiştir. Geliştirilme tarihi 1972 olmasına rağmen yaygınlaşması Brian Kernighan ve Dennis M. Ritchie tarafından yayımlanan "C Programlama Dili" kitabından sonra hızlanmıştır. Günümüzde neredeyse tüm işletim sistemlerinin yapımında %95'lere varan oranda kullanılmış, hâlen daha sistem, sürücü yazılımı, işletim sistemi modülleri ve hız gereken her yerde kullanılan oldukça yaygın ve sınırları belirsiz oldukça keskin bir dildir. Keskinliği, programcıya sonsuz özgürlüğün yanında çok büyük hatalar yapabilme olanağı sağlamasıdır. Programlamanın gelişim süreciyle beraber programlamanın karmaşıklaşması, gereksinimlerin artması ile uygulama programlarında nesne yönelimliliğin ortaya çıkmasından sonra C programcıları büyük ölçüde nesne yönelimliliği destekleyen C++ diline geçmişlerdir.

<span class="mw-page-title-main">C++</span> bir programlama dili

C++, Bjarne Stroustrup tarafından 1979 yılında Bell Laboratuvarları'nda geliştirilmeye başlanmış, C'yi kapsayan ve çok paradigmalı, yaygın olarak kullanılan, genel amaçlı bir programlama dilidir.

<span class="mw-page-title-main">Aslan</span> Afrika ve Asyaya özgü büyük bir kedi

Aslan veya arslan, Panthera cinsindeki büyük kedilerden biridir ve kedigiller (Felidae) ailesinin bir üyesidir. 184-208 cm (72-82 in) kafa-gövde uzunluğuna sahip yetişkin erkek bireyler, 160-184 cm (63-72 in) uzunluğundaki dişilerden daha büyüktür. Pride adı verilen gruplar oluşturan sosyal bir türdür. Bir aslan grubu, birkaç yetişkin erkekten, ilgili dişilerden ve yavrulardan oluşur. Dişi aslan grupları genellikle birlikte avlanır ve çoğunlukla büyük toynaklıları hedef alır. Aslan bir süper avcı ve kilittaşı avcısıdır. Her ne kadar bazı aslanların fırsatlar ortaya çıktığında insanları avladıkları bilinse de, tipik olarak bunu yapmazlar.

Şablon Metaprogramlama, C++ programlama dilinde derleme zamanında hesaplama yapan programlar yazmaktır.

<span class="mw-page-title-main">İkili arama algoritması</span>

İkili arama, sıralı bir dizide, belirli değerin aranmasına yönelik bir algoritmadır. Her adımda, aranan değerin dizinin orta değerine eşit olup olmadığı kontrol edilir. Eşit ise aranan bulunmuştur. Aranan değer orta değerden küçükse, dizinin sıralı olduğu kabulünden, ortanın yukarısına bakmaya gerek kalmaz, arama dizinin başı ve orta değer arasında devam eder. Aranan ortadan büyükse arama orta ile son arasında devam eder. Her adımda dizi ikiye bölünür.

<span class="mw-page-title-main">Bellek yönetimi</span>

Ana belleğin işlemler arasında paylaştırılmasına ana bellek yönetimi ya da bellek yönetimi adı verilir. İşletim sisteminin bu amaçla oluşturulan kesimine de bellek yöneticisi adı verilir.

<span class="mw-page-title-main">Monte Carlo yöntemi</span>

Monte Carlo benzetimi, çok sayıda tekrarlanan rastgele örneklemelerle, bir takım nümerik sonuçlar elde etmeye yarayan ve bilimin birçok alanında yaygın olarak kullanılan bir sayısal hesaplama algoritmaları sınıfıdır. Stokastik olayların yer aldığı fiziksel süreçlerin sonuçlarının tahmin edilmesinde çok kullanışlıdır. Ayrıca, rastgele seçimlerin işe yaradığı ve prensipte deterministik olan bir takım problemlerin çözümünde de kullanılmaktadır. Monte-Carlo yöntemi, Nicholas Constantine Metropolis (1915-1999) tarafından bulunmuştur ve Atom bombasının geliştirildiği Los Alamos Ulusal Labratuvarında, bombanın patlamasından sonra dağılan nötronlara karşı kalkan modellemek için Stanislaw Ulam tarafından günümüze taşınmıştır.

<span class="mw-page-title-main">Merhaba dünya programı</span> Geleneksel acemi bilgisayar programı

Merhaba dünya programı, görsel bir arayüz veya komut satırında "Merhaba dünya!" yazdıran bilgisayar programıdır. Bunun amacı, yeni öğrenilen programlama dilinde basit bir yazı yazmak ve programlama mantığını anlatmaktır.

<span class="mw-page-title-main">Kabuk sıralaması</span>

Shell sıralaması, bilgisayar bilimlerinde kullanılan bir sıralama algoritmasıdır. Eklemeli sıralama algoritmasının aşağıdaki iki gözlem kullanılarak genelleştirilmiş biçimidir:

<span class="mw-page-title-main">Project Euler</span> Matematik/Programlama Problemi

Project Euler veya Euler Projesi, çözülmesi için matematiksel kavrayışlardan daha fazlasını gerektiren bir dizi zorlu matematik/bilgisayar programlama problemidir. Her ne kadar matematik zarif ve etkili yöntemlere ulaşmanıza yardımcı olsa da, çoğu problemi çözmek için bir bilgisayar ve programlama becerileri gerekecektir. Toplam problem sayısı 800'den fazladır ve hala projeye etkin olarak problem eklenmektedir.

Bilgisayar programlamada dinamik iletim, altyordam çağrılarının ilişkin altyordam başlangıç adresine dinamik olarak bağlanmasıdır. Bir diğer deyişle, dinamik iletim program metnindeki bir çağrı ile işletilen altyordamın programın çalışması sırasında birbirine bağlanması durumudur. Geri çağrı ve çokbiçimliliğin realize edilmesinde kullanılan bu bağlama yöntemi, yordamsal programlama dillerinde altyordam göstericileriyle gerçekleştirilirken, nesne yönelimli dillerde kalıtlama ve gerçekleştirme ilişkilerinin kullanılmasıyla otomatikman sağlanır. Altyordamların birinci sınıf dil öğesi olarak ele alındığı fonksiyonel programlama dillerinde ise, aynı işlevsellik altyordamların argüman olarak geçirilmesi ile sağlanabilir.

Nesne yönelimli programlama dillerinde arayüz, değişik sınıflardan nesnelerin kategorize edilmesini sağlayan bir soyut tür çeşitidir. Tanımlanmakta olan kategorinin birbirleriyle alakasız sınıfları ortak bir çatı altında toplaması nedeniyle, arayüz tanımları, soyut sınıfların aksine, listeledikleri iletilerin gerçekleştirim ayrıntısı olan herhangi bir bilgi içeremezler. Dolayısıyla, bir arayüz tanımı iletilere karşılık gelen bir altyordam gövdesi veya altalan tanımı içeremez. Bir başka açıdan bakarsak, arayüz tanımında yer alan programlama öğelerinin zaman içinde değişme olasılığı düşük öğeler olması gerekir. Buna göre, arayüz tanımları gerçekleştirimci ile kullanıcının paylaştığı ve sabit olma özelliği bulunan altyordam imzaları ile simgesel sabit tanımlarını barındırabilir.

Soyut sınıf, nesne yönelimli programlamada nesnesi yaratılamayan sınıflara denir. Nesne yaratılamamasının nedeni, sınıfın kullanıcı arayüzünde yer alan bir veya daha çok sayıdaki iletinin gerçekleştirilmemesidir.

<span class="mw-page-title-main">OpenMP</span>

OpenMP; Solaris, IBM AIX, HP-UX, GNU/Linux, MAC OS X ve Windows işletim sistemleri üzerinde çoğu işlemci mimarisi üzerinde Fortran, C++, C programlama dillerinde çoklu platform paylaşımlı bellek çoklu işlemeyi destekleyen bir uygulama geliştirme arayüzüdür, yani bir API'dir. OpenMP derleyici yönergelerinin kütüphane rutinlerini ve ortam değişkenlerinin çalışma zamanı davranışını etkileyen bir kümesini içerir.

<span class="mw-page-title-main">COVID-19</span> SARS-CoV-2nin neden olduğu bulaşıcı hastalık

Koronavirüs hastalığı 2019 (COVID-19) şiddetli akut solunum sendromu koronavirüsü 2 (SARS-CoV-2)'nin neden olduğu bulaşıcı bir hastalıktır. İlk vaka ile Çin'in Hubei eyaletinin Wuhan şehrinde Kasım 2019 tarihinde karşılaşılmıştır. O zamandan bu yana yayılmaya devam etmiş ve dünya genelinde pandemiye neden olmuştur. Ancak bu pandemi geçtiğimiz yıl birçok ülkede sona ermiştir. 3 Mart 2020 itibarıyla dünya çapında ölüm oranı %3,4 olup, 12 Nisan 2024 tarihi itibarıyla Dünya'da 704.753.890 onaylanmış vaka, 675.619.811 iyileşen varken virüs nedeniyle 7.010.681 hasta öldü.

<span class="mw-page-title-main">FIFO algoritması</span>

FIFO algoritmasının mantığı basittir. Bellek yöneticisinin yeni bir sayfaya yer açmak için, hangi sayfayı dışarıda bırakacağını karar veren algoritmalardan biridir. Yönlendiriciye gelen ilk paket, iletilecek ilk pakettir.

<span class="mw-page-title-main">Carbon (programlama dili)</span>

Carbon, Google tarafından "C++ Ardıl Dili" olarak oluşturulmuş deneysel bir genel amaçlı programlama dilidir. İlk olarak 2022 yılının Temmuz ayında Carruth Chandler tarafından CppNorth konferansında halka sunuldu. Dil, C++'ın belirlenen çeşitli eksikliklerini düzeltmeyi amaçlar, ancak bunun dışında benzer bir özellik seti de sağlar. Hedeflerinden biri, mevcut C++ kodu ile beraber çift yönlü birlikte çalışabilirliktir. Dil, C++'ın kullandığı ISO sürecinin aksine GitHub üzerinde tasarlanacak ve geliştirilecektir. Dil, Apache Lisansı altında ücretsiz ve açık kaynaklı bir proje olarak geliştirilmiştir.

Yakala-kısırlaştır-yerine bırak (TNR-Trap–neuter–return), bazı ülkelerde sokak köpeği ve sokak kedisi popülasyonlarını kontrol etmek için uygulanan ancak bilimsel olarak işlerliğinin olmadığı gösterilmiş bir yöntemdir. Süreç, sokak köpeklerinin veya kedilerin canlı olarak yakalanmasını, kısırlaştırılmasını, kimlik tespiti ve kolay tanıma için kulaklarına işaret takılmasını, aşılanmasını ve ardından alındıkları bölgeye bırakılması şeklindedir.

C++17, C++ programlama dili için yayınlanan ISO/IEC 14882 standardının bir versiyonudur. C++17, bir önceki C++ standardı olan C++14'ün yerine geçmiş, sonrasında C++20 ile yerdeğiştirmiştir.

C23, C programlama dilinin açık standard taslağıdır ve ISO/IEC 9899:2024 olarak yayınlanması ve C17'nin yerini alması beklenmektedir. 2016'da gayriresmi olarak C2x ve adıyla üzerinde çalışılmaya başlanmıştır ve Ekim 2024'te yayınlanması beklenmektedir. C23'ün en son taslağı 1 Nisan 2023'te yayınlanmıştır ve genel erişime açıktır. WG14 C2x taslağı için ilk olarak Ekim 2019 toplanmış, 2020'te COVID-19 pandemisi nedeniyle toplantılar sanal olarak uzaktan yapılmış, sonrasında telekonferans toplantıları 2024 boyunca devam etmiştir. Haziran 2024'teki açık standardta 'C23'ün bitiminden sonra, "C2y" olarak adlandırıldığı' belirtilmiştir.