Çokbiçimlilik (İngilizce: polymorphism), 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! }
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
wikipedia, wiki, viki, vikipedia, oku, kitap, kütüphane, kütübhane, ara, ara bul, bul, herşey, ne arasanız burada,hikayeler, makale, kitaplar, öğren, wiki, bilgi, tarih, yukle, izle, telefon için, turk, türk, türkçe, turkce, nasıl yapılır, ne demek, nasıl, yapmak, yapılır, indir, ücretsiz, ücretsiz indir, bedava, bedava indir, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, resim, müzik, şarkı, film, film, oyun, oyunlar, mobil, cep telefonu, telefon, android, ios, apple, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, pc, web, computer, bilgisayar
Cokbicimlilik Ingilizce polymorphism bir turun bir baska tur gibi davranabilme ve bu tur gibi kullanilabilme ozelligidir Nesne yonelimli programlama dillerinde cokbicimlilik ozelligi ise ayni temel siniftan turetilmis olan siniflarda paylasilan baska bir ifadeyle asiri yuklenen ayni metodun bu siniflarda farkli sekillerde uyarlanabilmesidir Nesnenin davranisi calisma aninda belirlendigi icin programcilar cokbicimlilik ozelligi sayesinde nesnelerin turunu onceden bilmek zorunda kalmaz OrneklerC include lt string gt include lt type traits gt include lt iostream gt 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 lt Animal gt static assert std is base of v lt Animal Cat gt static assert std is base of v lt Animal Dog gt std string talk const Animal amp a return a talk int main Cat minnos Dog karabas std cout lt lt talk minnos lt lt n Miyav std cout lt lt talk karabas lt lt n Hav Hav C 17 ve sonrasi std variant tipi kullanarak https en cppreference com w cpp utility variant include lt string gt include lt variant gt include lt iostream gt struct Cat std string talk const return Miyav struct Dog std string talk const return Hav Hav using Animal std variant lt Cat Dog gt std string talk const Animal amp a struct v std string operator const Cat amp c const return c talk std string operator const Dog amp d const return d talk return std visit v a int main Cat minnos Dog karabas std cout lt lt talk minnos lt lt n Miyav std cout lt lt talk karabas lt lt n Hav Hav C 17 ve sonrasi std any tipi kullanarak https en cppreference com w cpp utility any include lt string gt include lt any gt include lt iostream gt struct Cat std string talk const return Miyav struct Dog std string talk const return Hav Hav std string talk const std any amp animal if const Cat c std any cast lt Cat gt amp animal return c gt talk else if const Dog d std any cast lt Dog gt amp animal return d gt talk return std string int main Cat minnos Dog karabas std cout lt lt talk minnos lt lt n Miyav std cout lt lt talk karabas lt lt 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 Kaynakca