Junior
У чему је суштина апстрактне класе?
sobes.tech АИ
Одговор од АИ
Suština apstraktne klase je da služi kao šablon za druge klase. Ne može biti direktno kreirana, ali može sadržavati apstraktne metode (bez tela), kao i konkretne metode i svojstva.
Ključne tačke:
- Ne može se napraviti primerak:
new ApstraktnaKlasa()će izazvati grešku. - Nasleđivanje: Samo nasleđivanje (
extends). - Apstraktne metode: Definišu interfejs koji moraju implementirati podklase. Obeležavaju se ključnom rečju
abstracti nemaju telo. - Konkretne metode i svojstva: Mogu biti direktno definisani i korišćeni, kao i prepisani u podklasama.
- Delimična implementacija: Pruža opštu strukturu i određenu osnovnu funkcionalnost, ostavljajući detalje implementacije na podklasama.
Primer:
<?php
abstract class Oblik {
protected $boja;
public function __construct($boja) {
$this->boja = $boja;
}
abstract public function izracunajPovrsinu(); // Apstraktna metoda
public function uzmiBoju() {
return $this->boja;
}
}
class Krug extends Oblik {
private $poluprecnik;
public function __construct($boja, $poluprecnik) {
parent::__construct($boja);
$this->poluprecnik = $poluprecnik;
}
public function izracunajPovrsinu() {
return pi() * $this->poluprecnik * $this->poluprecnik;
}
}
class Kvadrat extends Oblik {
private $stranica;
public function __construct($boja, $stranica) {
parent::__construct($boja);
$this->stranica = $stranica;
}
public function izracunajPovrsinu() {
return $this->stranica * $this->stranica;
}
}
// Primer korišćenja
$krug = new Krug("Crvena", 5);
echo "Površina kruga: " . $krug->izracunajPovrsinu() . ", Boja: " . $krug->uzmiBoju() . "\n";
$kvadrat = new Kvadrat("Plava", 4);
echo "Površina kvadrata: " . $kvadrat->izracunajPovrsinu() . ", Boja: " . $kvadrat->uzmiBoju() . "\n";
// Sledeći kod će izazvati grešku: Fatal error: Ne može se instancirati apstraktna klasa
// $apstraktniOblik = new Oblik("Nepoznato");
Tabela poređenja sa interfejsima i običnim klasama:
| Karakteristika | Apstraktna klasa | Interfejs | Obična klasa |
|---|---|---|---|
| Kreiranje instance | Ne | Ne | Da |
| Nasleđivanje | Da (extends) + Implementacija (implements) |
Samo Implementacija (implements) |
Da (extends) |
| Metode | Konkretne i apstraktne | Samo apstraktne (bez tela) | Samo konkretne |
| Svojstva | Da | Ne | Da |
| Višestruko nasleđivanje | Ne | Da | Ne |
| Svrha | Delimična implementacija, opšta struktura | Definisanje ugovora (ponašanja) | Potpuna implementacija, konkretan objekat |
Koristi se kada postoji zajednička logika i svojstva koja moraju imati grupa povezanih klasa, ali njihovo konkretno ponašanje (implementacija nekih metoda) se razlikuje. Osigurava višekratnu upotrebu koda i jedinstvenu strukturu klasa.