19. Gli Oggetti e il Polimorfismo
PHP ci consente di sfruttare le potenzialità del Polimorfismo, una tecnica di programmazione orientata agli oggetti e basata sull'ereditarietà.
Il Polimorfismo è la capacità di utilizzare un unico metodo in grado di comportarsi in modo specifico quando applicato a tipi di dato differenti.
Questo è reso possibile grazie all'ereditarietà, che consente alle sottoclassi di ridefinire i metodi ereditati dalla classe base.
Il linguaggio può identificare una qualunque istanza della sottoclasse, come un'istanza della classe base, poichè per il principio dell'ereditarietà, ogni sottoclasse possiede per natura tutte le proprietà della classe base (attributi e metodi).
Vedremo ora due classi normali, senza l'utilizzo di ereditarietà e polimorfismo, che implementeremo successivamente :
Esempio senza Polimorfismo
<?php
class Cane
{
function zampeCane()
{
echo "Zampe : 4";
}
}
class Gallina
{
function zampeGallina()
{
echo "Zampe : 2";
}
}
function numeroZampe($oggetto)
{
if ($oggetto instanceof Cane) // Condizione = Se oggetto è un istanza della classe Cane
{
$oggetto->zampeCane();
}
else if ($oggetto instanceof Gallina)
{
$oggetto->zampeGallina();
}
else
{
echo "Tipo di oggetto non riconosciuto!!";
}
}
numeroZampe(new Cane()); // Stampa : "Zampe : 4"
numeroZampe(new Gallina()); // Stampa : "Zampe : 2"
?>Ora riscriverò il codice dell'esempio soprastante utilizzando il polimorfismo
Esempio con Polimorfismo
<?php
class Animale
{
/* Rendiamo protetto il metodo per obbligare una redefinizione in una
sottoclasse necessaria a sbloccare l'utilizzo del metodo dall'esterno.
Più avanti per ottenere un risultato migliore useremo le Classi Astratte. */
protected function zampe()
{
echo "Errore : la funzione va obbligatoriamente ridefinita da una sottoclasse!";
}
}
class Cane extends Animale
{
public function zampe()
{
echo "Zampe : 4";
}
}
class Gallina extends Animale
{
public function zampe()
{
echo "Zampe : 2";
}
}
function numeroZampe($oggetto)
{
if ($oggetto instanceof Animale) // Condizione = Se oggetto è un istanza di Animale o derivata da essa
{
$oggetto->zampe();
}
else
{
echo "Tipo di oggetto non riconosciuto!!";
}
}
numeroZampe(new Cane()); // Stampa : "Zampe : 4"
numeroZampe(new Gallina()); // Stampa : "Zampe : 2"
?>Nel secondo esempio possiamo notare innanzitutto che abbiamo stabilito un nome univoco per il nostro metodo ("zampe()"), ereditato direttamente dalla classe base Animale. Altro punto di forza è la flessibiità ottenuta nella funzione esterna numeroZampe(), che sarà in grado di gestire anche altri classi oltre a Cane e Gallina, che potremo definire anche in un secondo momento senza necessità alcuna di apportare modifiche alla funzione numeroZampe() o alle tre classi (Animale, Cane e Gallina). |
Nota : l'operatore instanceof si comporta come un normale operatore logico binario, e viene impiegato per individuare se un'istanza è della classe specificata o derivata da essa.
- Linguaggi:
- Tags:
