Výuka IT

Procvičování: Dědičnost a polymorfismus

Vytvořme nový Python program a programujme podle následujících pokynů:

  1. Základní dědičnost:
    • Vytvořte třídu Vozidlo s atributy znacka a model a metodou info(), která vypíše informace o vozidle.
    • Vytvořte třídu Auto, která dědí z Vozidlo a přidává atribut pocet_dveri.
    • Přepište metodu info() ve třídě Auto, aby vypisovala i počet dveří.
    • Vytvořte instanci třídy Auto a zavolejte metodu info().
  2. Přepisování metod (Overriding):
    • Vytvořte třídu Uvar s metodou obsah(), která vrátí 0 (nebo vyvolá výjimku NotImplementedError).
    • Vytvořte třídy Ctverec a Kruh, které dědí z Utvar.
    • Implementujte metodu obsah() pro Ctverec (strana * strana) a Kruh (pi * polomer^2).
    • Vytvořte instance obou tvarů a vypište jejich obsahy.
  3. Polymorfismus:
    • Vytvořte seznam obsahující instance různých zvířat (např. Pes, Kocka, Kachna), která mají metodu zvuk().
    • Projděte seznam cyklem a pro každé zvíře zavolejte metodu zvuk(), aniž byste zjišťovali, o jaký konkrétní druh zvířete se jedná.

Řešení

import math

# 1. Základní dědičnost
class Vozidlo:
    def __init__(self, znacka, model):
        self.znacka = znacka
        self.model = model

    def info(self):
        return f"Vozidlo: {self.znacka} {self.model}"

class Auto(Vozidlo):
    def __init__(self, znacka, model, pocet_dveri):
        super().__init__(znacka, model)
        self.pocet_dveri = pocet_dveri

    def info(self):
        return f"Auto: {self.znacka} {self.model}, Dveře: {self.pocet_dveri}"

moje_auto = Auto("Škoda", "Octavia", 5)
print(moje_auto.info())

# 2. Přepisování metod
class Utvar:
    def obsah(self):
        raise NotImplementedError("Tato metoda musí být implementována v potomkovi")

class Ctverec(Utvar):
    def __init__(self, strana):
        self.strana = strana

    def obsah(self):
        return self.strana ** 2

class Kruh(Utvar):
    def __init__(self, polomer):
        self.polomer = polomer

    def obsah(self):
        return math.pi * (self.polomer ** 2)

ctverec = Ctverec(5)
kruh = Kruh(3)
print(f"Obsah čtverce: {ctverec.obsah()}")
print(f"Obsah kruhu: {kruh.obsah():.2f}")

# 3. Polymorfismus
class Pes:
    def zvuk(self):
        return "Haf"

class Kocka:
    def zvuk(self):
        return "Mňau"

class Kachna:
    def zvuk(self):
        return "Kach kach"

zvirata = [Pes(), Kocka(), Kachna()]

print("\nZvuky zvířat:")
for zvire in zvirata:
    print(zvire.zvuk())