Flere grænseflader i OOP i PHP
I PHP er der ikke multipel arv - hver
klasse kan kun have én forælder.
Med grænseflader er det dog anderledes:
hver klasse kan implementere et hvilket som helst antal
grænseflader. For at gøre dette skal navnene på grænsefladerne
opstilles efter nøgleordet implements adskilt af komma.
Dette viser en anden forskel mellem grænseflader og abstrakte klasser - man kan implementere mange grænseflader, men man kan ikke arve fra flere abstrakte klasser.
Lad os prøve det i praksis. Antag at vi foruden
grænsefladen iFigure også har
grænsefladen iTetragon.
Metoderne i denne grænseflade vil blive implementeret af
klasserne Quadrate og Rectangle,
da de har 4 sider, men ikke klassen
Disk.
Lad grænsefladen iTetragon beskrive
gettere for alle fire sider
på en firkan:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Antag også at vi har grænsefladen iFigure,
som vi lavede tidligere:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Lad os sørge for, at klassen Quadrate
implementerer to grænseflader. For at gøre dette opstiller vi
begge grænseflader adskilt af komma efter nøgleordet
implements:
<?php
class Quadrate implements iFigure, iTetragon
{
// implementering vil være her
}
?>
Lad os nu tilpasse vores klasse Quadrate,
så den implementerer grænsefladen iTetragon.
Det er klart, at vores kvadrat er et degenereret
tilfælde af en firkan, da alle sider i et kvadrat
er lige lange. Derfor vil alle de nye metoder
returnere det samme - kvadratets bredde:
<?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 indlysende, at ikke alle sider i et rektangel
er ens, kun de modstående sider er.
I dette tilfælde vil de nye metoder være lidt
forskellige. Og i for eksempel en trapez
vil alle 4 sider være forskellige.
Uanset hvilken figur vi betragter, er det dog vigtigt, at alle disse figurer vil have de beskrevne metoder (selvom nogle figurer er degenererede) og fungere på en ensartet måde.
Sørg for, at klassen Rectangle
også implementerer to grænseflader: både iFigure,
og iTetragon.
Lav grænsefladen iCircle med metoderne
getRadius og getDiameter.
Sørg for, at klassen Disk også
implementerer to grænseflader: både iFigure,
og iCircle.