Flere grensesnitt i OOP i PHP
I PHP finnes det ikke multiple arv - hver
klasse kan bare ha én forelder.
Med grensesnitt er det derimot annerledes:
hver klasse kan implementere et hvilket som helst antall
grensesnitt. For å gjøre dette må grensesnittnavnene
listes opp etter komma etter nøkkelordet
implements.
Dette viser en annen forskjell mellom grensesnitt og abstrakte klasser - man kan implementere mange grensesnitt, men man kan ikke arve fra flere abstrakte klasser.
La oss prøve dette i praksis. Anta at vi i tillegg til
grensesnittet iFigure også har
et grensesnitt iTetragon.
Metodene til dette grensesnittet vil bli implementert av
klassene Quadrate og Rectangle,
siden de har 4 sider, men ikke av klassen
Disk.
Anta at grensesnittet iTetragon beskriver
gettere for alle fire sidene
i en firkant:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Anta også at vi har grensesnittet iFigure,
som vi lagde tidligere:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
La oss sørge for at klassen Quadrate
implementerer to grensesnitt. For å gjøre dette lister vi opp
begge grensesnittene etter komma etter nøkkelordet
implements:
<?php
class Quadrate implements iFigure, iTetragon
{
// implementasjon kommer her
}
?>
La oss videreutvikle klassen Quadrate nå,
så den implementerer grensesnittet iTetragon.
Det er klart at kvadratet vårt er et degenerert
tilfelle av en firkant, fordi i et kvadrat
er alle sidene like. Derfor vil alle de nye metodene
returnere det samme - bredden på kvadratet:
<?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;
}
}
?>
Det er åpenbart at i et rektangel er ikke alle
sidene like, bare de motsatte sidene.
I dette tilfellet vil de nye metodene bli litt
forskjellige. Og i for eksempel en trapes
vil alle 4 sidene være helt forskjellige.
Uansett hvilken figur vi vurderer, er det imidlertid ikke viktig - det viktige er at alle disse figurene vil ha de beskrevne metodene (selv om noen figurer er degenererte) og fungere på en standardisert måte.
Sørg for at klassen Rectangle
også implementerer to grensesnitt: både iFigure,
og iTetragon.
Lag et grensesnitt iCircle med metoder
getRadius og getDiameter.
Sørg for at klassen Disk også
implementerer to grensesnitt: både iFigure,
og iCircle.