Maturitní otázka č. 2

2. Programování – Objekty

1. Co je objekt, jak vzniká a jak jej nahradit v ne-objektových jazycích

Objekt je základním stavebním kamenem objektově orientovaného programování (OOP). Představuje softwarový model reálného nebo abstraktního prvku (např. auto, uživatel, bankovní účet). Skládá se ze dvou hlavních částí:

Vznik objektu:

Objekt vzniká procesem zvaným instanciace (vytvoření instance). Vychází se z tzv. třídy (Class), což je obecný předpis (šablona nebo "formička"), podle které se objekt v operační paměti vytvoří. Při vzniku se alokuje paměť a zavolá se speciální metoda zvaná konstruktor. V mnoha jazycích se k tomu používá klíčové slovo "new".

Nahrazení v ne-objektových jazycích:

V procedurálních jazycích, jako je čisté C, objekty neexistují. Můžeme je ale simulovat (nahradit) pomocí datových struktur (např. "struct" v C), které sdružují více proměnných různých typů pod jedno jméno. Metody (chování) se pak nahrazují běžnými volně stojícími funkcemi, kterým jako jeden z parametrů předáváme ukazatel právě na tuto strukturu, aby funkce věděla, s jakými daty má pracovat.

2. Koncepce objektově orientovaného programování (OOP)

Koncepce OOP vznikla jako reakce na složitost údržby rozsáhlých procedurálních programů. Cílem je modelovat program tak, aby odpovídal myšlení člověka v reálném světě. OOP stojí na čtyřech základních pilířích:

3. Objektově orientované programovací jazyky

Dnes je podpora OOP standardem u většiny populárních jazyků. Dělíme je na:

4. Konstruktory, destruktory a přetížení (Overloading)

Konstruktor: Je speciální metoda, která se spouští zcela automaticky přesně v momentě vytváření nové instance třídy (objektu). Jeho hlavním úkolem je inicializovat objekt – nastavit výchozí hodnoty atributů a alokovat potřebné zdroje. Obvykle nenese návratový typ a často se jmenuje stejně jako samotná třída (např. v Javě, C#) nebo má speciální název (např. __init__ v Pythonu).

Destruktor: Speciální metoda volaná automaticky před samotným zánikem objektu (když program končí nebo je objekt smazán z paměti). Slouží k úklidu – uzavření souborů, ukončení síťových spojení nebo uvolnění explicitně alokované paměti. V jazycích s tzv. Garbage Collectorem (C#, Java) se destruktory v tradičním pojetí nepoužívají tak často jako např. v C++, protože paměť se uvolňuje automaticky.

Přetížení (Overloading): Jde o situaci, kdy máme v jedné třídě více metod (nebo konstruktorů) se zcela STEJNÝM názvem, ale liší se v tzv. signatuře – tedy v počtu nebo v datových typech vstupních parametrů. Kompilátor při volání sám určí, která verze se má spustit, na základě toho, s jakými daty ji voláme.

5. Praktická ukázka: Třída s atributy, přetíženým konstruktorem a metodou

Jako ukázku využijeme jazyk C# (popřípadě syntaxe odpovídá i Javě), protože nativně ukazuje přetížení konstruktorů. Vytvoříme třídu Auto splňující všechny požadavky zadání:

class Auto:
    # a) čtyři atributy dvou různých datových typů (str a int)
    znacka: str
    model: str
    rok: int
    pocet_km: int

    # b) konstruktor s přetížením (výchozí hodnoty = přetížení v Pythonu)
    def __init__(self, znacka="Neznámá", model="Neznámý", rok=2000, pocet_km=0):
        self.znacka = znacka
        self.model = model
        self.rok = rok
        self.pocet_km = pocet_km

    # c) metoda, která není konstruktorem
    def popis(self):
        return f"{self.znacka} {self.model} ({self.rok}), najeto: {self.pocet_km} km"


# Použití s různými verzemi konstruktoru
auto1 = Auto()                            # bez parametrů
auto2 = Auto("Škoda", "Octavia", 2020, 35000)  # se všemi parametry

print(auto1.popis())
print(auto2.popis())

Poznámka k přetížení v Pythonu: Python nepodporuje více konstruktorů jako Java/C++. Místo toho se používají výchozí hodnoty parametrů — volání Auto() i Auto("Škoda", "Octavia", 2020, 35000) jsou obě platná, což přetížení simuluje. Toto je v Pythonu standardní přístup.

| Bod | Splnění | | ---------------------------- | ----------------------------------------------------------------------------------------------- | | a) 4 atributy, 2 datové typy | znacka, model → str; rok, pocet_km → int | | b) Konstruktor s přetížením | __init__ má výchozí hodnoty — v Pythonu se přetížení řeší takto (nelze definovat více __init__) | | c) Metoda mimo konstruktor | popis() vrací textový popis auta | Dokument 28 – Aktivní webovky, redakční systém

Aktivní webovky, redakční systém