Sobes.tech
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 abstract i 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.