Sobes.tech
Junior

Kokia yra abstraktaus klasės esmė?

sobes.tech AI

Atsakymas iš AI

Abstrakti klasė yra šablonas kitiems klasėms. Jis negali būti sukurtas tiesiogiai, bet gali turėti abstrakčius metodus (be turinio), kurie turi būti įgyvendinti vaikų klasėse, taip pat konkrečius metodus ir savybes.

Pagrindinės savybės:

  • Negalima sukurti objekto: new AbstraktiKlase() sukels klaidą.
  • Paveldėjimas: tik paveldėjimas (extends).
  • Abstraktūs metodai: apibrėžia sąsają, kurią turi įgyvendinti vaiko klasės. Pažymėti žodžiu abstract ir neturi turinio.
  • Konkrečios metodai ir savybės: gali būti apibrėžti ir naudojami tiesiogiai, taip pat perrašyti vaikų klasėse.
  • Dalinis įgyvendinimas: suteikia bendrą struktūrą ir tam tikrą bazinį funkcionalumą, detales paliekant vaikų klasėms.

Pavyzdys:

<?php

abstract class Figūra {
    protected $spalva;

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

    abstract public function apskaičiuotiPlotą(); // Abstraktus metodas

    public function gautiSpalvą() {
        return $this->spalva;
    }
}

class Apskritimas extends Figūra {
    private $spindulys;

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

    public function apskaičiuotiPlotą() {
        return pi() * $this->spindulys * $this->spindulys;
    }
}

class Kvadratas extends Figūra {
    private $krastinė;

    public function __construct($spalva, $krastinė) {
        parent::__construct($spalva);
        $this->krastinė = $krastinė;
    }

    public function apskaičiuotiPlotą() {
        return $this->krastinė * $this->krastinė;
    }
}

// Pavyzdys naudojimo
$apskritimas = new Apskritimas("Raudona", 5);
echo "Apskritimo plotas: " . $apskritimas->apskaičiuotiPlotą() . ", Spalva: " . $apskritimas->gautiSpalvą() . "\n";

$kvadratas = new Kvadratas("Mėlyna", 4);
echo "Kvadrato plotas: " . $kvadratas->apskaičiuotiPlotą() . ", Spalva: " . $kvadratas->gautiSpalvą() . "\n";

// Sekantis kodas sukels klaidą: Fatal error: Instantiating an abstract class
// $abstraktiFigūra = new Figūra("Nežinoma");

Lyginamoji lentelė su sąsajomis ir įprastais klasėmis:

Savybė Abstrakti klasė Sąsaja Įprasta klasė
Objekto kūrimas Ne Ne Taip
Paveldėjimas Taip (extends) + įgyvendinimas (implements) Tik įgyvendinimas (implements) Taip (extends)
Metodai Konkrečiai ir abstrakčiai Tik abstrakčiai (be turinio) Tik konkretūs
Savybės Taip Ne Taip
Daugiapaveldėjimas Ne Taip Ne
Paskirtis Dalinis įgyvendinimas, bendroji struktūra Kontrakto apibrėžimas (elgsena) Pilnas įgyvendinimas, konkretus objektas

Naudojama, kai yra bendroji logika ir savybės, kurios turi būti susijusiuose klasėse, tačiau jų konkretus elgesys (metodų įgyvendinimas) skiriasi. Užtikrina kodo daugkartinį naudojimą ir vienodą struktūrą.