Polymorfismus umožňuje programátorovi pracovat s různými objekty, jako by to byl jeden obecný typ, přičemž každý z těchto objektů si zachovává své specifické chování. Je to mechanismus, který dělá kód flexibilním, rozšiřitelným a snadno udržitelným.
V programování rozlišujeme dva hlavní druhy polymorfismu podle toho, kdy se rozhoduje o tom, která metoda se spustí:
Dochází k němu v době překladu (Compile-time). Typickým příkladem je přetěžování metod (Overloading). V jedné třídě existuje více metod se stejným názvem, které se liší pouze počtem nebo typem parametrů.
vypocti(int a) vs. vypocti(double a).Dochází k němu až za běhu programu (Runtime). Je úzce spjat s dědičností a využívá překrývání metod (Overriding). Program zavolá metodu na obecném objektu, ale díky polymorfismu se spustí verze definovaná v konkrétním potomkovi.
Představte si, že vyvíjíte grafický editor. Máte obecnou třídu Tvar a z ní zděděné třídy Kruh, Ctverec a Trojuhelnik.
vykresli().Tvar.tvar.vykresli().Výsledek: Programátor nemusí řešit, co je zrovna na řadě. Kruh se vykreslí jako kruh a čtverec jako čtverec, i když se k nim v kódu přistupuje jako k obecnému „tvaru“.
Hvezda), nemusíte měnit kód, který tvary vykresluje. Stačí, aby Hvezda implementovala metodu vykresli().if (objekt je Kruh) kresliKruh() else if (objekt je Ctverec)….
Kromě dědičnosti lze polymorfismus realizovat pomocí rozhraní. Rozhraní říká, „co“ musí objekt umět, ale neříká „jak“.
* Příklad: Rozhraní IPlatebniMetoda má metodu zaplat(). Tuto metodu implementuje KreditniKarta (odesláním čísla karty) i PayPal (přihlášením k účtu). Programu je jedno, čím platíte, prostě jen zavolá zaplat().
Související pojmy: OOP, Dědičnost, Class, Instance, Overriding, Overloading, Interface, Abstraktní třída.