Sobes.tech
Junior

Qual è il senso di una classe astratta?

sobes.tech AI

Risposta dell'AI

Lo scopo di una classe astratta è fungere da modello per altre classi. Non può essere creata direttamente, ma può contenere metodi astratti (senza corpo), che devono essere implementati nelle classi derivate, così come metodi e proprietà concreti.

Punti chiave:

  • Impossibile creare un'istanza: new ClasseAstratta() causerà un errore.
  • Ereditarietà: Si può ereditare solo da una classe astratta (extends).
  • Metodi astratti: Definiscono l'interfaccia che le classi derivate devono implementare. Sono contrassegnati dalla parola chiave abstract e non hanno corpo.
  • Metodi e proprietà concreti: Possono essere definiti e utilizzati direttamente, così come sovrascritti nelle classi derivate.
  • Implementazione parziale: Fornisce una struttura generale e alcune funzionalità di base, lasciando i dettagli di implementazione alla discrezione delle classi derivate.

Esempio:

<?php

abstract class Figura {
    protected $colore;

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

    abstract public function calcolaArea(); // Metodo astratto

    public function ottieniColore() {
        return $this->colore;
    }
}

class Cerchio extends Figura {
    private $raggio;

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

    public function calcolaArea() {
        return pi() * $this->raggio * $this->raggio;
    }
}

class Quadrato extends Figura {
    private $lato;

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

    public function calcolaArea() {
        return $this->lato * $this->lato;
    }
}

// Esempio di utilizzo
$cerchio = new Cerchio("Rosso", 5);
echo "Area del cerchio: " . $cerchio->calcolaArea() . ", Colore: " . $cerchio->ottieniColore() . "\n";

$quadrato = new Quadrato("Blu", 4);
echo "Area del quadrato: " . $quadrato->calcolaArea() . ", Colore: " . $quadrato->ottieniColore() . "\n";

// Il seguente codice causerà un errore fatale: istanziazione di una classe astratta
// $formaAstratta = new Figura("Sconosciuto");

Tabella comparativa con interfacce e classi normali:

Caratteristica Classe astratta Interfaccia Classe normale
Creazione di istanza No No
Ereditarietà Sì (extends) + Implementazione (implements) Solo Implementazione (implements) Sì (extends)
Metodi Concreti e astratti Solo astratti (senza corpo) Solo concreti
Proprietà No
Ereditarietà multipla No No
Scopo Implementazione parziale, struttura generale Definizione di contratto (comportamento) Implementazione completa, oggetto concreto

Viene utilizzato quando ci sono logiche e proprietà comuni che devono essere presenti in un gruppo di classi correlate, ma il loro comportamento specifico (implementazione di alcuni metodi) varia. Consente il riutilizzo del codice e l'uniformità nella struttura delle classi.