Useita rajapintoja OOP:ssa PHP:ssä
PHP:ssä ei ole moniperintää - jokaisella
luokalla voi olla vain yksi vanhempi.
Rajapintojen kanssa asia on kuitenkin toisin:
jokainen luokka voi toteuttaa minkä tahansa määrän
rajapintoja. Tätä varten rajapintojen nimet
on lueteltava pilkuilla erotettuna avainsanan
implements jälkeen.
Tässä ilmenee toinen ero rajapintojen ja abstraktien luokkien välillä - voi toteuttaa monta rajapintaa, mutta useita abstrakteja luokkia ei voi periä.
Kokeillaan käytännössä. Oletetaan, että
rajapinnan iFigure lisäksi meillä on myös
rajapinta iTetragon.
Tämän rajapinnan metodit toteuttavat
luokat Quadrate ja Rectangle,
koska niillä on 4 sivua, mutta ei luokka
Disk.
Oletetaan, että rajapinta iTetragon kuvaa
getterit kaikille neljälle nelikulmion
sivulle:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Oletetaan myös, että meillä on rajapinta iFigure,
jön teimme aiemmin:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Tehdään niin, että luokka Quadrate
toteuttaa kaksi rajapintaa. Tätä varten luettelemme
molemmat rajapinnat pilkuilla erotettuna avainsanan
implements jälkeen:
<?php
class Quadrate implements iFigure, iTetragon
{
// tulee toteutus
}
?>
Kehitetään nyt luokkaamme Quadrate,
jotta se toteuttaisi rajapinnan iTetragon.
On selvää, että neliömme on rappeutunut
tapaus nelikulmiosta, sillä neliöllä
kaikki sivut ovat yhtä suuret. Siksi kaikki uudet metodit
palauttavat saman asian - neliön leveyden:
<?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;
}
}
?>
On selvää, että suorakulmiossa kaikki
sivut eivät ole enää samoja, vaan vain vastakkaiset.
Tässä tapauksessa uudet metodit eroavat hieman
toisistaan. No, ja jossain puolisuunnikkaassa
kaikki 4 sivut ovat yleensä erilaisia.
Siitä huolimatta, millaista kuviota tarkastelemme, ei kuitenkaan ole väliä - tärkeää on, että kaikki nämä kuviot sisältävät kuvatut metodit (vaikka jotkin kuviot ovatkin rappeutuneita) ja toimivat yhtenäisesti.
Tee niin, että luokka Rectangle
myös toteuttaa kaksi rajapintaa: sekä iFigure,
että iTetragon.
Tee rajapinta iCircle metodeilla
getRadius ja getDiameter.
Tee niin, että luokka Disk myös
toteuttaa kaksi rajapintaa: sekä iFigure,
että iCircle.