Metodi astratti nella OOP in PHP
Le classi astratte possono anche contenere metodi astratti. Tali metodi non devono avere implementazione, ma servono per indicare che tali metodi devono essere presenti nelle classi derivate. E la implementazione di tali metodi - è già compito delle classi derivate.
Per dichiarare un metodo come astratto,
alla sua dichiarazione si deve scrivere la parola chiave
abstract.
Proviamo nella pratica. Supponiamo che
tutte le classi derivate della classe User debbano
avere il metodo increaseRevenue.
Questo metodo deve prendere il reddito corrente dell'utente e aumentarlo di un certo valore, passato come parametro.
La classe User stessa non sa quale
reddito avrà la classe derivata - dopotutto, per un dipendente
è lo stipendio, mentre per uno studente - la borsa di studio. Quindi
ogni classe derivata implementerà questo metodo
a modo suo.
Il punto qui è che il metodo astratto della classe
User obbliga il programmatore a implementare
questo metodo nelle classi derivate, altrimenti PHP darà un errore.
In questo modo voi, o un altro programmatore
che lavora con il vostro codice,
non potrete in alcun modo
dimenticare di implementare il metodo richiesto
nella classe derivata.
Quindi, proviamo nella pratica. Aggiungiamo
il metodo astratto increaseRevenue
alla classe User:
<?php
abstract class User
{
private $name;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
// Metodo astratto senza corpo:
abstract public function increaseRevenue($value);
}
?>
Lasciamo che la nostra classe Employee rimanga per ora
immutata. In questo caso, anche se non
creiamo un oggetto della classe Employee,
ma semplicemente eseguiamo il codice in cui sono definite
le nostre classi, - PHP darà un errore.
Scriviamo ora l'implementazione del metodo
increaseRevenue nella classe
Employee:
<?php
class Employee extends User
{
private $salary;
public function getSalary()
{
return $this->salary;
}
public function setSalary($salary)
{
$this->salary = $salary;
}
// Scriviamo l'implementazione del metodo:
public function increaseRevenue($value)
{
$this->salary = $this->salary + $value;
}
}
?>
Verifichiamo il funzionamento della nostra classe:
<?php
$employee = new Employee;
$employee->setName('john');
$employee->setSalary(1000);
$employee->increaseRevenue(100);
echo $employee->getSalary();
?>
Implementiamo il metodo increaseRevenue anche
nella classe Student. Solo che ora il nostro
metodo aumenterà la borsa di studio:
<?php
class Student extends User
{
private $scholarship; // borsa di studio
public function getScholarship()
{
return $this->scholarship;
}
public function setScholarship($scholarship)
{
$this->scholarship = $scholarship;
}
// Il metodo aumenta la borsa di studio:
public function increaseRevenue($value)
{
$this->scholarship = $this->scholarship + $value;
}
}
?>
Aggiungi alla tua classe User lo stesso
metodo astratto increaseRevenue.
Scrivi l'implementazione di questo metodo nelle classi
Employee e Student.
Nella classe Figure crea metodi astratti
per ottenere l'area e il perimetro della figura.