Disa Ndërfaqe në OOP në PHP
Në PHP nuk ka trashëgimi të shumëfishtë - çdo
klasë mund të ketë vetëm një prind.
Me ndërfaqet, megjithatë, situata është ndryshe:
çdo klasë mund të implementojë çdo numër
ndërfaqesh. Për këtë, emrat e ndërfaqeve
duhet të listohen të ndarë me presje pas fjalës kyçe
implements.
Kjo tregon një tjetër ndryshim midis ndërfaqeve dhe klasave abstrakte - mund të implementosh shumë ndërfaqe, por nuk mund të trashëgosh disa klasa abstrakte.
Le të provojmë në praktikë. Le të supozojmë se përveç
ndërfaqes iFigure kemi edhe
ndërfaqen iTetragon.
Metodat e kësaj ndërfaqeje do të implementohen nga
klasat Quadrate dhe Rectangle,
meqenëse ato kanë 4 brinjë, por jo nga klasa
Disk.
Le të supozojmë se ndërfaqja iTetragon përshkruan
methodat get për të katër brinjët
e një katërkëndëshi:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Le të supozojmë gjithashtu se kemi ndërfaqen iFigure,
që e kemi krijuar më parë:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Le të bëjmë që klasa Quadrate
të implementojë dy ndërfaqe. Për këtë, le të listojmë
të dyja ndërfaqet e ndara me presje pas fjalës kyçe
implements:
<?php
class Quadrate implements iFigure, iTetragon
{
// këtu do të jetë implementimi
}
?>
Le të përsosim tani klasën tonë Quadrate,
në mënyrë që ajo të implementojë ndërfaqen iTetragon.
Është e qartë se katrori ynë është një rast i degjeneruar
i një katërkëndëshi, pasi te katrori
të gjitha brinjët janë të barabarta. Prandaj të gjitha metodat e reja
do të kthejnë të njëjtën gjë - gjerësinë e katrorit:
<?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;
}
}
?>
Është e qartë se në një drejtkëndësh, jo të gjitha
brinjët janë të njëjta, por vetëm ato të kundërta.
Në këtë rast, metodat e reja do të ndryshojnë pak.
Dhe, në një trapezoid,
në përgjithësi të gjitha 4 brinjët do të jenë të ndryshme.
Sidoqoftë, nuk ka rëndësi se çfarë figure do të marrim në konsideratë - çfarë ka rëndësi është se të gjitha këto figura do të kenë metodat e përshkruara (edhe pse disa figura janë të degjeneruara) dhe do të funksionojnë në mënyrë të njëtrajtshme.
Bëni që klasa Rectangle
të implementojë gjithashtu dy ndërfaqe: si iFigure,
ashtu edhe iTetragon.
Krijoni një ndërfaqe iCircle me metoda
getRadius dhe getDiameter.
Bëni që klasa Disk gjithashtu
të implementojë dy ndërfaqe: si iFigure,
ashtu edhe iCircle.