Objektově orientované programovaní I

Editovat
Note

Zapouzdření, dědičnost, polymorfizmus. Realizace uvedených principů OOP v C++ nebo Javě (podle vlastní volby).

PB161/PB162

Objektově orientované programování (OOP) je snaha modelovat reálný svět pomocí tříd a jejich instancí čili _objektů.

Zapouzdření

Je princip shlukování dat (proměnných) a funkcionality (funkcí) v jedné jednotce — třídě. Definice třídy udává, které metody a proměnné jsou přístupné zvenku, jsou veřejné.

V C++

class Train {
private:
    int _weight;
    int _passengerCount;
    std::string _name;
    std::string _destination;

public:
    const std::string& name() {
        return _name;
    }

    void destination(const std::string& destination) {
        _destination = destination;
    }
};

V Javě

public class Train
{
    private int weight;
    private int passengerCount;
    private String name;
    private String destination;

    public String getName() {
        return name;
    }

    public void setDestination(String dst) {
        destination = dst;
    }
}

Dědičnost

Princip sdílění proměnných a funkcích mezi třídami. Umožnuje modelovat některé vztahy v reálném světě. Vzniká hierarchie tříd.

V C++

struct Vehicle {
    int passengerCount;
};

struct Car : public Vehicle {
    int wheelCount;
};

struct Truck : public Car {
    int capacity;
};

V Javě

class Vehicle
{
    int passengerCount;
}

class Car extends Vehicle
{
    int wheelCount;
}

class Truck extends Car
{
    int capacity;
}

Polymorfismus

Umožňuje se k objektu chovat jako k jeho nadtřídě nebo rozhraní, které implementuje, zejména přistupovat k proměnným a volat funkce. Objekt má více ,,tvarů''.

Override

Nahrazení funkce z nadřazené třídy funkcí novou se stejným názvem.

Overloading

Koexistence vícera funkcí se stejným názvem, ale různými parametry.

V C++

  • Lze overridovat pouze metody označené jako virtual.

  • Pokud objekt mažeme skrze pointer na nadtřídu, musí destruktor nadtřídy být virtual, aby byl objekt správně zničen.

V Javě

  • Lze overridovat pouze instanční metody neoznačené jako final.

Abstraktní třídy

Třídy, které nelze instancovat, ale lze z nich dědit.

V Javě je nutno třídu označit jako abstract stejně jako každou metodu, kterou musí potomek doimplementovat.

V C++ je abstraktní třída taková, která obsahuje alespoň jednu abstraktní metodu. Abstraktní metody mají místo těla = 0;.