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
abstracte 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 | Sì |
| Ereditarietà | Sì (extends) + Implementazione (implements) |
Solo Implementazione (implements) |
Sì (extends) |
| Metodi | Concreti e astratti | Solo astratti (senza corpo) | Solo concreti |
| Proprietà | Sì | No | Sì |
| Ereditarietà multipla | No | Sì | 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.