Obsah
Polymorfismus (Mnohotvárnost)
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.
Typy polymorfismu
V programování rozlišujeme dva hlavní druhy polymorfismu podle toho, kdy se rozhoduje o tom, která metoda se spustí:
1. Statický polymorfismus (Ad-hoc)
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ů.
- Příklad: Metoda
vypocti(int a)vs.vypocti(double a).
2. Dynamický polymorfismus
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.
Praktický příklad: Grafické tvary
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.
- Všechny tyto třídy mají metodu
vykresli(). - Vy máte seznam (pole) objektů typu
Tvar. - Program projde seznam a u každého prvku zavolá
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“.
Proč je polymorfismus důležitý?
- Flexibilita: Pokud do programu přidáte nový druh tvaru (např.
Hvezda), nemusíte měnit kód, který tvary vykresluje. Stačí, abyHvezdaimplementovala metoduvykresli(). - Zjednodušení kódu: Odstraňuje potřebu složitých konstrukcí typu
if (objekt je Kruh) kresliKruh() else if (objekt je Ctverec)…. - Rozšiřitelnost: Umožňuje vytvářet systémy zásuvných modulů (pluginů), kde hlavní program volá metody, aniž by předem znal jejich konkrétní implementaci.
Polymorfismus a Rozhraní (Interface)
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.
