InformaticaProgrammazione

Guida a OOP: Classi, Astratti, Interfacce

Se stai iniziando a programmare, probabilmente hai sentito parlare di “classi” in diversi contesti. Ma sai qual è la differenza tra una classe concreta, astratta e un’interfaccia? In questo articolo, ti forniremo una guida facile e semplice per comprendere queste tre importanti costrutti della programmazione orientata agli oggetti.

Una classe concreta è una classe che può essere istanziata direttamente e che contiene metodi e proprietà implementate.

//Classe concreta
class Automobile {
  private $marca;
  private $modello;
  private $anno;

  public function __construct($marca, $modello, $anno) {
    $this->marca = $marca;
    $this->modello = $modello;
    $this->anno = $anno;
  }

  public function getInfo() {
    return "Marca: {$this->marca}, Modello: {$this->modello}, Anno: {$this->anno}";
  }
}

$auto = new Automobile("Fiat", "Panda", 2021);
echo $auto->getInfo(); // Output: "Marca: Fiat, Modello: Panda, Anno: 2021"

Una classe astratta è una classe che non può essere istanziata direttamente e che può contenere solo dichiarazioni di metodi e proprietà, lasciando l’implementazione a sottoclassi concrete.

// Classe astratta
abstract class Veicolo {
  protected $marca;
  protected $modello;
  protected $anno;

  public function __construct($marca, $modello, $anno) {
    $this->marca = $marca;
    $this->modello = $modello;
    $this->anno = $anno;
  }

  abstract public function getInfo();
}
// Classe che estende la classe astratta Veicolo
class Moto extends Veicolo {
  private $cilindrata;

  public function __construct($marca, $modello, $anno, $cilindrata) {
    parent::__construct($marca, $modello, $anno);
    $this->cilindrata = $cilindrata;
  }

  public function getInfo() {
    return "Marca: {$this->marca}, Modello: {$this->modello}, Anno: {$this->anno}, Cilindrata: {$this->cilindrata}";
  }
}

$moto = new Moto("Honda", "CBR600RR", 2022, 600);
echo $moto->getInfo(); // Output: "Marca: Honda, Modello: CBR600RR, Anno: 2022, Cilindrata: 600"

Un’interfaccia è una collezione di metodi e proprietà dichiarati senza implementazione, che deve essere implementata dalle classi che la utilizzano.

// Interfaccia
interface Veicolo {
  public function accelera();
  public function frenare();
}
// Classe che implementa l'interfaccia Veicolo
class Automobile implements Veicolo {
  private $marca;
  private $modello;
  private $velocita;

  public function __construct($marca, $modello) {
    $this->marca = $marca;
    $this->modello = $modello;
    $this->velocita = 0;
  }

  public function accelera() {
    $this->velocita += 10;
    echo "L'automobile {$this->marca} {$this->modello} accelera a {$this->velocita} km/h.\n";
  }

  public function frenare() {
    $this->velocita -= 5;
    echo "L'automobile {$this->marca} {$this->modello} frena a {$this->velocita} km/h.\n";
  }
}

$auto = new Automobile("Fiat", "Panda");
$auto->accelera(); // Output: "L'automobile Fiat Panda accelera a 10 km/h."
$auto->frenare();  // Output: "L'automobile Fiat Panda frena a 5 km/h."

Perché è importante conoscere la differenza tra queste tre costruzioni? Perché l’utilizzo di classi astratte e interfacce può portare a una maggiore modularità e flessibilità del codice, consentendo di scrivere codice più generico e riutilizzabile. Inoltre, l’uso di queste costruzioni può facilitare la scrittura di test e migliorare la manutenibilità del codice.

/ 5
Grazie per aver votato!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *