OOP po lopate - Dedenie a Abstraktnosť

Dedenie spolu s abstrakciou sú klúčové koncepty OOP. Sú to práve tieto kocepty, ktoré nám dovoľujú nie len sprehľadniť kód, ale aj ho členiť do logických častí.

Dedenie

Predstavme si príklad z úvodu:

**Zviera**
- eat()
- play()

**Pes (Zviera)** # Táto zátvorka znamená, že dedí od Zvieratka
- bark()

My vieme, že metódy ako papanie a hranie je pre každé jedno zvieratko, či už je to pes, mačka alebo zajačik. Skúsme teraz porozmýšlať nad rôznymi príkladmi zo života:

Tak o čom to vlastne je? Ako vidíte snažíme sa hľadať niečo podobné, podobné vlastnosti, metódy. Následne vytvoríme takúto super triedu a povieme všetkým tým, ktoré majú tieto vlastnosti, aby od nej dedili.

Abstrakcia

Uhádnete, v ktorom prípade z tých dvoch je abstrakcia? Chvíľka napätia, dramatické bubnovanie… V prvom. Tadá. A teraz prečo?

Viete si predstaviť Dopravný prostriedok? Predstavili ste si auto alebo snáď motorku? No, to popravde neviem, pretože je to abstraktný pojem v tomto kontexte, povedal som vám, že budem mať triedy Auto, Motorku, Bicykel. Ale z toho vyplýva, že super trieda Dopravný prostriedok je niečo neurčité, čo zatiaľ nemá podobu a môže existovať len Auto, Motorka, Bicykel.

Ale, prečo nie Zamestnanec? Skúste si predstaviť zamestanca, napríklad programátora, môže to byť Jožo, Fero, Karol… Stále sú zamestanci, rozdiel medzi nimi nie je, možno Jožo programuje rýchlejšie, no stále je len inštanciou triedy Zamestnanec, jednoducho vieme vytvoriť zamestanca, ale dopravný prostriedok nevieme vytvoriť dokým si nepovieme vytvor Auto. Čo taký Manažér? Je to to isté, tiež si vieme nejakého predstaviť.

Implementacia

Väčšina jazykov využíva klúčové slovo extends, čo znamená rozšír mi triedu, oddeď mi tie metódy a tribúty tej super triedy. Abstrakcia funguje v dobrých jazykoch :smile:, hovorí len o jednom, túto triedu s abstract nemôžeš inicializovať, respektíve vytvoriť inštanciu.

class Employee:
  pass

class Manager(Employee):
  pass
Ako vidíme, Manažér dedí od Zamestnanca, sadly abstrakcia neexistuje v Pythone. Zároveň v tomto prípade ani neplatí.
// Vehicle.java
public abstract class Vehicle {
    private int maxSpeed = 5;

    public int getMaxSpeed() {
        return this.maxSpeed;
    }
}

// Car.java
public class Car extends Vehicle {
    private int maxSpeed = 330;
}

// Main.java
public class Main {
    public static void main(String[] args) {
        Vehicle c = new Car();
        // Vehicle h = new Vehicle(); // Error
    }
}
V tomto príklade vidíme ako sme prepísali maximálnu rýchlosť pre Auto, zároveň sme oddedili metódu a atribút maxSpeed. Všimnime si využitie
Vehicle c = new Car();
viac sa o tom dozvieme pri Interface, ale hovoríme že dátový typ bude typu Car aj Vehicle.