Sobes.tech
Junior

V čem spočívá podstata abstraktní třídy?

sobes.tech AI

Odpověď od AI

Podstata abstraktní třídy spočívá v tom, že slouží jako šablona pro jiné třídy. Nemůže být přímo vytvořena, ale může obsahovat abstraktní metody (bez těla), stejně jako konkrétní metody a vlastnosti.

Klíčové body:

  • Nelze vytvořit instanci: new AbstraktTrida() způsobí chybu.
  • Dědičnost: Pouze dědění (extends).
  • Abstraktní metody: Definují rozhraní, které musí být implementováno podtřídami. Označují se klíčovým slovem abstract a nemají tělo.
  • Konkrétní metody a vlastnosti: Mohou být přímo definovány a použity, stejně jako přepsány v podtřídách.
  • Částečná implementace: Poskytuje obecnou strukturu a určitou základní funkcionalitu, detaily implementace jsou na podtřídách.

Příklad:

<?php

abstract class Tvar {
    protected $barva;

    public function __construct($barva) {
        $this->barva = $barva;
    }

    abstract public function vypocitatPlochu(); // Abstraktní metoda

    public function ziskejBarvu() {
        return $this->barva;
    }
}

class Kruh extends Tvar {
    private $polomer;

    public function __construct($barva, $polomer) {
        parent::__construct($barva);
        $this->polomer = $polomer;
    }

    public function vypocitatPlochu() {
        return pi() * $this->polomer * $this->polomer;
    }
}

class Ctverec extends Tvar {
    private $strana;

    public function __construct($barva, $strana) {
        parent::__construct($barva);
        $this->strana = $strana;
    }

    public function vypocitatPlochu() {
        return $this->strana * $this->strana;
    }
}

// Příklad použití
$kruh = new Kruh("Červená", 5);
echo "Plocha kruhu: " . $kruh->vypocitatPlochu() . ", Barva: " . $kruh->ziskejBarvu() . "\n";

$ctverec = new Ctverec("Modrá", 4);
echo "Plocha čtverce: " . $ctverec->vypocitatPlochu() . ", Barva: " . $ctverec->ziskejBarvu() . "\n";

// Následující kód způsobí chybu: Fatal error: Nelze instancovat abstraktní třídu
// $abstraktniTvar = new Tvar("Neznámý");

Porovnávací tabulka s rozhraními a běžnými třídami:

Charakteristika Abstraktní třída Rozhraní Běžná třída
Vytvoření instance Ne Ne Ano
Dědičnost Ano (extends) + Implementace (implements) Pouze Implementace (implements) Ano (extends)
Metody Konkrétní a abstraktní Pouze abstraktní (bez těla) Pouze konkrétní
Vlastnosti Ano Ne Ano
Vícečetná dědičnost Ne Ano Ne
Účel Částečná implementace, obecná struktura Definice kontraktu (chování) Kompletní implementace, konkrétní objekt

Používá se, když existuje společná logika a vlastnosti, které musí mít skupina souvisejících tříd, ale jejich konkrétní chování (implementace některých metod) se liší. Zajišťuje opakované použití kódu a jednotnou strukturu tříd.