Úloha 1:
Na stiahnutie: more_simulacia.py
def f(x, y):
print("values: ", x, y)
f(42, 43)
f(42, 43.7)
f(42.3, 43)
f(42.0, 43.9)
Aký je rozdiel oproti funkciám v C, C++, Jave?
Dedičnosť nevznikla iba kvôli lenivosti programátorov, ktorí nechceli písať dvakrát rovnaký kód. Keď vieme, že každé Maciatko a Steniatko, alebo akákoľvek ďalšia podtrieda je zvieratko, tak si môžeme urobiť zoznam zvieratiek s tým, že je jedno, aké presné zvieratká ide:
zvieratka = [Maciatko('Micka'), Steniatko('Dunco')]
for zvieratko in zvieratka:
zvieratko.zjedz('pamlsok')
Toto je veľmi dôležitá vlastnosť podtried: keď máme nejaké Maciatko, môžeme ho použiť kdekoľvek, kde program očakáva Zvieratko, pretože každé mačiatko je zvieratko.
Toto je pomôcka pre prípady, keď si nieste istí, ktorú triedu podediť z ktorej. Každé mačiatko alebo šteniatko je zvieratko, každá chata alebo panelák je budova. V týchto prípadoch dáva dedičnosť zmysel.
Niekedy sa ale stane, že pri použití tejto pomôcky dostaneme nezmysel, napríklad: “každé auto je volant”. V tomto prípade nepoužívame dedičnosť. I keď sa aj volant, aj auto dajú otočiť doprava, pri každom to znamená niečo iné. Väčší význam dáva, ak povieme: “každé auto má volant”, rovnaklo ako “každé mača má meno”. Vhodnejšie je preto vytvoriť dve triedy a spojiť ich napríklad takto:
class Auto:
def __init__(self):
self.volant = Volant()
__str__()
, vracajúcu “Som auto” a “Som bicykel”. Potom vytvor zoznam s inštanciami týchto tried a v cykle ich vypíš pomocou print().π * r²
, a Square obsah štvorca podľa vzorca a²
. Následne vytvor zoznam objektov týchto tried a vypíš ich obsahy.Keď sa pozrieme na metódy zamňaukaj a zaštekaj, možno vám napadne, že by sme ich mohli nazvať tak, aby sa dali použiť pre všetky zvieratká, tovnako ako metóda zjedz. Napríklad:
class Zvieratko:
def __init__(self, meno):
self.meno = meno
def zjedz(self, jedlo):
print(f"{self.meno}: {jedlo} mi chutí!")
class Maciatko(Zvieratko):
def urob_zvuk(self):
print(f"{self.meno}: Mňau!")
class Steniatko(Zvieratko):
def urob_zvuk(self):
print(f"{self.meno}: Haf!")
zvieratka = [Maciatko('Micka'), Steniatko('Dunčo')]
for zvieratko in zvieratka:
zvieratko.urob_zvuk()
zvieratko.zjedz('pamlsok')
Tento príklad nám naznačil, že písať nadtriedy, z ktorých sa dobre dedí, nie je až také jednoduché. Obzvášť to platí, ak by sa malo dediť v inom programe, ako je nadtrieda. Z toho dôvodu je vhodné používať dedičnosť hlavne v rámci vlastného kódu, nedoporučuje sa dediť z tried, ktoré naprogramoval niekto iný (napríklad: bool a pod.), pokiaľ to neodporučí priamo autor nad triedy.