Classi Astratte

L’Astrazione dei Dati viene utilizzata per gestire al meglio la complessità di un programma, ovvero viene applicata per decomporre sistemi software complessi in componenti più piccoli e semplici.

Creando un esempio semplice.

Class: Animale
Metodi: mangia() respira() peso() altezza() e tutto quello che può caratterizzare un animale

Bisognerebbe però definire le singole istanze $cane = new Animale(); $gatto = new Animale(); etc…
In questo caso non possiamo creare infinite istanze per ogni tipo di animale, quindi Animale è una Classe Astratta, cioè una classe che non può essere istanziata. L’unica cosa a cui ci può servire è per ottenere delle classi derivate più specifiche.

La struttura sarà la seguente:

Class: Animale
1/2 Metodi + Motodi Astratti che sono solo una definizione del metodo stesso

Class: Cane
fornisce obbligatoriamente l’implementazione dei Metodi Astratti

Class: Gatto
fornisce obbligatoriamente l’implementazione dei Metodi Astratti

etc…

In PHP utilizziamo la keyword ‘abstract’

LA CLASSE ASTRATTA


// Team A - Class Product
abstract class Product {
 
    // proprietà pubbliche
    public $name;
    public $price;
 
    // metodi pubblici
    public function __construct($name, $price) {
        $this->name = $name;
        $this->price = $price;   
    }
     
    public function getName() {
        return $this->name;
    }
     
    public function getPrice() {
        return $this->price;
    }
 
    // metodi astratti contengono SOLO delle definizioni
    abstract public function buyProduct($pid, $quantity);
    abstract public function sellProduct($pid, $quantity);
 
}

LE CLASSI CHE ESTENDONO LA CLASSE ATRATTA


// Team B - Class InProduct
class InProduct extends Product {
 
    public function buyProduct($pid, $quantity) {
     
        // connettiamoci al nostro database locale per ottenere i prodotti che dobbiamo comprare con la quanità indicata...
        $prods = connect_to_my_local_db($db->login(), $quantity);
        $prods->sendmail("buy");
         
        // ...
     
    }
     
    public function sellProduct($pid, $quantity) {
     
        // connettiamoci al nostro database locale per ottenere i prodotti che dobbiamo vendere con la quanità indicata...
        $prods = connect_to_my_local_db($db->login(), $quantity);
        $prods->sendmail("sell");
         
        // ...
     
    }
 
}
 
 
// Team C - Class OutProduct
class OutProduct extends Product {
 
    public function buyProduct($pid, $quantity) {
     
        // connettiamoci al database del partner per ottenere i prodotti che dobbiamo comprare con la quanità indicata...
        $prods = connect_to_partner_db($db->login(), $quantity);
        $prods->sendmail("buy");
         
        // ...
     
    }
     
    public function sellProduct($pid, $quantity) {
     
        // connettiamoci al database del partner per ottenere i prodotti che dobbiamo vendere con la quanità indicata...
        $prods = connect_to_partner_db($db->login(), $quantity);
        $prods->sendmail("sell");
         
        // ...
     
    }
 
}

Ciò che è importante capire, è che nonostante le classi InProduct ed OutProduct siano create da diversi team di sviluppo, esse assumono una forma comune, coerente con quella indicata dalla classe astratta Product.

Se volessi creare un’API:


$pen = new InProduct("penna", 3.50);
$pencil = new OutProduct("matita", 3.50);
 
// vendiamo la penna
$pen->sellProduct(1102, 1);
 
// compriamo una matita
$pencil->buyProduct(3498, 1);

Come funziona?
1. $pen = new InProduct(“penna”, 3.50); – creo un’istanza di class InProduct extends Product {

2. $pen->sellProduct(1102, 1); – invoca public function sellProduct($pid, $quantity)

3. $pid, $quantity è comune a – function sellProduct($pid, $quantity) – che risalendo estende – extends Product – che risalendo definisce – abstract public function sellProduct($pid, $quantity);

4. idem per – buyProduct($pid, $quantity) – che deve avere ($pid, $quantity) – perchè così indicato da – abstract public function buyProduct($pid, $quantity);

Il mio sito ufficiale:
www.lucedigitale.com

Bigliografia:
www.html.it/pag/18355/utilizzare-le-classi-astratte/