obrazky
-

Úloha 1:

  • Naprogramujte more. V mori budú žiť dva druhy rýb - sardinky a žraloky. Sažerú planktón a množia sa. Keďže planktónu je dosť, sardinky by časom zaplnili celé more. Žraloky žerú sardinky. Ak sú nažraté, tiež sa množia, ale ak nažraté nie sú, tak uhynú.
  • Použite pri implementácii dedičnosť

Na stiahnutie: more_simulacia.py

Polymofizmus

    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()
  1. Vytvor dve triedy, Cat a Dog, ktoré budú mať metódu make_sound(). Každá trieda implementuje túto metódu inak – mačka vráti “Mňau”, pes vráti “Hav”. Následne vytvor zoznam zvierat a v cykle zavolaj metódu make_sound() na každom objekte.
  2. Vytvor nadradenú triedu Animal s metódou make_sound(), ktorá vráti “Nejaký zvuk”. Potom vytvor podtriedy Cat a Dog, ktoré túto metódu prepíšu vlastnou implementáciou (“Mňau” a “Hav”). Nakoniec vytvor zoznam objektov rôznych tried a zavolaj na nich metódu make_sound().
  3. Vytvor funkciu add(x, y), ktorá bude vracať súčet dvoch hodnôt. Otestuj jej fungovanie s číslami, reťazcami a zoznamami. Funkcia by mala správne pracovať so všetkými týmito typmi vstupných hodnôt.
  4. Vytvor triedy Car a Bike, ktoré budú mať metódu __str__(), vracajúcu “Som auto” a “Som bicykel”. Potom vytvor zoznam s inštanciami týchto tried a v cykle ich vypíš pomocou print().
  5. Vytvor triedu Circle a Square, ktoré budú mať metódu area(). Circle bude počítať obsah kruhu podľa vzorca π * r², a Square obsah štvorca podľa vzorca . Následne vytvor zoznam objektov týchto tried a vypíš ich obsahy.

Zovšeobecnenie

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.

-
Copyright © 2008-2025 Miroslava Valíková