Flera gränssnitt i OOP i PHP
I PHP finns det inget multipelt arv - varje
klass kan bara ha en förälder.
Med gränssnitt är det dock annorlunda:
varje klass kan implementera valfritt antal
gränssnitt. För detta ska gränssnittens namn
listas efter nyckelordet implements, separerade med kommatecken.
Detta visar en annan skillnad mellan gränssnitt och abstrakta klasser - man kan implementera många gränssnitt, men man kan inte ärva flera abstrakta klasser.
Låt oss prova i praktiken. Antag att förutom
gränssnittet iFigure så har vi också
gränssnittet iTetragon.
Metoderna i detta gränssnitt kommer att implementeras av
klasserna Quadrate och Rectangle,
eftersom de har 4 sidor, men inte klassen
Disk.
Låt gränssnittet iTetragon beskriva
getters för alla fyra sidorna
på en fyrhörning:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Antag också att vi har gränssnittet iFigure,
som vi redan skapat tidigare:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Låt oss se till att klassen Quadrate
implementerar två gränssnitt. För detta listar vi
båda gränssnitten efter nyckelordet
implements, separerade med kommatecken:
<?php
class Quadrate implements iFigure, iTetragon
{
// implementation kommer här
}
?>
Låt oss nu utveckla vår klass Quadrate,
så att den implementerar gränssnittet iTetragon.
Det är tydligt att vår kvadrat är ett degenererat fall
av en fyrhörning, eftersom alla sidor i en kvadrat
är lika. Därför kommer alla nya metoder
att returnera samma sak - kvadratens bredd:
<?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;
}
}
?>
Uppenbarligen är inte alla sidor lika i en rektangel,
bara de motsatta sidorna.
I det här fallet kommer de nya metoderna att skilja sig något.
Och i till exempel en trapets
kommer alla 4 sidor att vara olika.
Men det spelar ingen roll vilken figur vi betraktar - det viktiga är att alla dessa figurer kommer att ha de beskrivna metoderna (även om vissa figurer är degenererade) och fungera på ett enhetligt sätt.
Se till att klassen Rectangle
också implementerar två gränssnitt: både iFigure,
och iTetragon.
Skapa gränssnittet iCircle med metoderna
getRadius och getDiameter.
Se till att klassen Disk också
implementerar två gränssnitt: både iFigure,
och iCircle.