Mai multe interfețe în OOP în PHP
În PHP nu există moștenire multiplă - fiecare
clasă poate avea un singur părinte.
Cu interfețele, însă, situația este diferită:
fiecare clasă poate implementa orice număr de
interfețe. Pentru a face acest lucru, numele interfețelor
trebuie enumerate separate prin virgulă după cuvântul cheie
implements.
Aceasta este o altă diferență între interfețe și clasele abstracte - se pot implementa multe interfețe, dar nu se pot moșteni mai multe clase abstracte.
Să încercăm în practică. Să presupunem că, pe lângă
interfața iFigure, avem și
interfața iTetragon.
Metodele acestei interfețe vor fi implementate de
clasele Quadrate și Rectangle,
deoarece acestea au 4 laturi, dar nu și de clasa
Disk.
Să presupunem că interfața iTetragon descrie
metodele de tip getter pentru toate cele patru laturi
ale patrulaterului:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Să presupunem că avem și interfața iFigure,
pe care am creat-o anterior:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Să facem ca clasa Quadrate
să implementeze două interfețe. Pentru a face acest lucru, enumerăm
ambele interfețe separate prin virgulă după cuvântul cheie
implements:
<?php
class Quadrate implements iFigure, iTetragon
{
// aici va fi implementarea
}
?>
Să modificăm acum clasa noastră Quadrate,
astfel încât să implementeze interfața iTetragon.
Este clar că pătratul nostru este un caz degenerat
al unui patrulater, deoarece un pătrat
are toate laturile egale. Prin urmare, toate noile metode
vor returna același lucru - lățimea pătratului:
<?php
class Quadrate implements iFigure, iTetragon
{
private $a;
public function __construct($a)
{
$this->a = $a;
}
public function getA()
{
return $this->a;
}
public function getB()
{
return $this->a;
}
public function getC()
{
return $this->a;
}
public function getD()
{
return $this->a;
}
public function getSquare()
{
return $this->a * $this->a;
}
public function getPerimeter()
{
return 4 * $this->a;
}
}
?>
Evident, într-un dreptunghi nu toate
laturile sunt identice, ci doar cele opuse.
În acest caz, noile metode vor fi ușor
diferite. Și, într-un trapez,
toate cele 4 laturi vor fi complet diferite.
Cu toate acestea, nu contează ce figură considerăm - important este că toate aceste figuri vor avea metodele descrise (chiar dacă unele figuri sunt degenerate) și vor funcționa într-un mod similar.
Faceți ca și clasa Rectangle
să implementeze două interfețe: atât iFigure,
cât și iTetragon.
Creați interfața iCircle cu metodele
getRadius și getDiameter.
Faceți ca și clasa Disk
să implementeze două interfețe: atât iFigure,
cât și iCircle.