Ďalší super princíp OOP je 🥁🥁🥁 polymorphism, po slovensky "polymorfizmus". Je to mechanizmus, ktorý dovoľuje aby volanie rovnomennej funkcie malo za následok rôzne správanie. Umožňuje nám písať všeobecnejší kód, použiteľný vo viacerých prípadoch, ktorého správanie sa adaptuje podľa toho, čo práve spracúva...
Lepšie je to vidieť v kóde...
Ak dve triedy majú každá rovnako pomenovanú metódu s rovnakým počtom parametrov, tak pri spracovaní inštancií týchto tried v cykle môžeme volať túto metódu a pri každej inštancií sa vykoná tá imlementácia, ktorá je definovaná v triede (class) danej inštancie.
class Pes():
def hovor(self):
print("hau hau")
class Macka():
def hovor(self):
print("mnau mnau")
for zvieratko in [Pes(), Macka(), Macka(), Pes()]:
zvieratko.hovor()
Tento program by vypísal:
hau hau
mnau mnau
mnau mnau
hau hau
Ak využívame dedenie, môže rovnakú metódu (rovnomennú) implementovať rodič (nadtrieda) aj dieťa (podtrieda), v tom prípade hovoríme, že dieťa prekrýva metódu predka. Pri volaní metódy na inštancii dieťaťa sa zavolá implementácia v dieťati. Implementácia v dieťati sa môže odkazovať na implementáciu predka pomocou super().
class Zvieratko():
def hovor(self):
print("Ja neviem rozprávať")
class Pes(Zvieratko):
def hovor(self):
print("hau hau")
class Macka(Zvieratko):
def hovor(self):
print("mnau mnau")
class Ryba(Zvieratko):
pass
for zvieratko in [Pes(), Macka(), Ryba()]:
zvieratko.hovor()
Všetky tri zvieratká majú metódu hovor(), všetky ju aj dedia, ale Pes a Macka ju prekrývajú vlastnou implementáciou.
Výstup:
hau hau
mnau mnau
Ja neviem rozprávať
Polymorfizmus môže byť aj v takejto forme - neprekrytá metóda v nadtriede využíva prekrytú metódu v podtriede...
class Zvieratko():
def hovor(self):
print("Ja neviem rozprávať")
def hovorVelaKrat(self, n):
for i in range(n):
self.hovor() # ak sa hovorVelaKrat vola na podtriede,
# ktora ma hovor() prekryte,
# vola sa prekryta verzia
class Pes(Zvieratko):
def hovor(self):
print("hau hau")
class Macka(Zvieratko):
def hovor(self):
print("mnau mnau")
class Ryba(Zvieratko):
pass
for zvieratko in [Pes(), Macka(), Ryba()]:
zvieratko.hovorVelaKrat(3)
Výstup:
hau hau
hau hau
hau hau
mnau mnau
mnau mnau
mnau mnau
Ja neviem rozprávať
Ja neviem rozprávať
Ja neviem rozprávať