Sobes.tech
Junior

Care este esența unei clase abstracte?

sobes.tech AI

Răspuns de la AI

Scopul unei clase abstracte este de a servi ca șablon pentru alte clase. Nu poate fi creată direct, dar poate conține metode abstracte (fără corp), care trebuie implementate în clasele derivate, precum și metode și proprietăți concrete.

Puncte cheie:

  • Nu se poate crea o instanță: new ClasaAbstractă() va cauza o eroare.
  • Moștenire: Se poate moșteni doar de la o clasă abstractă (extends).
  • Metode abstracte: Definește interfața pe care trebuie să o implementeze clasele derivate. Sunt marcate cu cuvântul cheie abstract și nu au corp.
  • Metode și proprietăți concrete: Pot fi definite și utilizate direct, precum și suprascrise în clasele derivate.
  • Implementare parțială: Oferă o structură generală și o anumită funcționalitate de bază, lăsând detaliile de implementare la discreția claselor derivate.

Exemplu:

<?php

abstract class Figura {
    protected $culoare;

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

    abstract public function calculeazaAria(); // Metodă abstractă

    public function obtineCuloare() {
        return $this->culoare;
    }
}

class Cerc extends Figura {
    private $raza;

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

    public function calculeazaAria() {
        return pi() * $this->raza * $this->raza;
    }
}

class Patrat extends Figura {
    private $latura;

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

    public function calculeazaAria() {
        return $this->latura * $this->latura;
    }
}

// Exemplu de utilizare
$cerc = new Cerc("Rosu", 5);
echo "Aria cercului: " . $cerc->calculeazaAria() . ", Culoare: " . $cerc->obtineCuloare() . "\n";

$patrat = new Patrat("Albastru", 4);
echo "Aria pătratului: " . $patrat->calculeazaAria() . ", Culoare: " . $patrat->obtineCuloare() . "\n";

// Codul următor va cauza o eroare fatală: instanțierea unei clase abstracte
// $formaAbstracta = new Figura("Necunoscut");

Tabel comparativ cu interfețe și clase normale:

Caracteristică Clasă abstractă Interfață Clasă normală
Creare instanță Nu Nu Da
Moștenire Da (extends) + Implementare (implements) Doar Implementare (implements) Da (extends)
Metode Concrete și abstracte Doar abstracte (fără corp) Doar concrete
Proprietăți Da Nu Da
Moștenire multiplă Nu Da Nu
Scop Implementare parțială, structură generală Definirea unui contract (comportament) Implementare completă, obiect concret

Este utilizată atunci când există logică și proprietăți comune care trebuie să fie la un grup de clase legate, dar comportamentul lor specific (implementarea anumitor metode) diferă. Asigură reutilizarea codului și uniformitatea în structura claselor.