Több interfész az OOP-ban PHP-ben
A PHP-ban nincs többszörös öröklődés - minden
osztálynak csak egy szülője lehet.
Az interfészekkel azonban más a helyzet:
minden osztály bármennyi interfészt megvalósíthat.
Ehhez az interfészek neveit
vesszővel elválasztva kell felsorolni a kulcsszó
implements után.
Ez egy további különbség az interfészek és az absztrakt osztályok között - sok interfészt meg lehet valósítani, de több absztrakt osztályt nem lehet örökölni.
Próbáljuk ki gyakorlatban. Tegyük fel, hogy az
iFigure interfészen kívül van
egy iTetragon interfészünk is.
Ennek az interfésznek a metódusait a
Quadrate és Rectangle osztályok
valósítják meg,
mivel nekik 4 oldaluk van, de a
Disk osztály nem.
Tegyük fel, hogy az iTetragon interfész leírja
a gettereket a négyszög mind a négy oldalához:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Tegyük fel, hogy van még az iFigure interfészünk is,
amelyet korábban már készítettünk:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Tegyük úgy, hogy a Quadrate osztály
két interfészt valósítson meg. Ehhez soroljuk fel
mindkét interfészt vesszővel elválasztva a kulcsszó
implements után:
<?php
class Quadrate implements iFigure, iTetragon
{
// itt lesz a megvalósítás
}
?>
Dolgozzuk most tovább a Quadrate osztályunkat,
hogy megvalósítsa az iTetragon interfészt.
Nyilvánvaló, hogy a négyzetünk a négyszög
degenerált esete, hiszen a négyzetnek
minden oldala egyenlő. Ezért az összes új metódus
ugyanazt fogja visszaadni - a négyzet szélességét:
<?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;
}
}
?>
Nyilvánvaló, hogy a téglalapban már nem minden
oldal egyforma, hanem csak a szemköztiek.
Ebben az esetben az új metódusok kissé
meg fognak különbözni. Nos, és egy trapéznál
általában mind a 4 oldal különböző lesz.
Azonban nem számít, milyen alakzatot vizsgálunk - fontos, hogy ezek az alakzatok mind rendelkeznek a leírt metódusokkal (még ha némelyik alakzat degenerált is) és egyformán működnek.
Tegye úgy, hogy a Rectangle osztály
szintén két interfészt valósítson meg: mind az iFigure-t,
mind az iTetragon-t.
Készítsen egy iCircle interfészt a
getRadius és getDiameter metódusokkal.
Tegye úgy, hogy a Disk osztály is
két interfészt valósítson meg: mind az iFigure-t,
mind az iCircle-t.