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
abstractir 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ą.