Verskeie koppelvlakke in OOP in PHP
In PHP is daar nie veelvuldige oorerwing nie - elke
klas kan slegs een ouer hê.
Met koppelvlakke is dit egter anders:
elke klas kan enige aantal
koppelvlakke implementeer. Om dit te doen, moet die name van die koppelvlakke
geskei deur kommas na die sleutelwoord
implements gelys word.
Dit toon nog 'n verskil tussen koppelvlakke en abstrakte klasse - jy kan baie koppelvlakke implementeer, maar jy kan nie verskeie abstrakte klasse oorerf nie.
Kom ons probeer dit in die praktyk. Behalwe vir die
koppelvlak iFigure, het ons ook die
koppelvlak iTetragon.
Die metodes van hierdie koppelvlak sal geïmplementeer word deur
klasse Quadrate en Rectangle,
aangesien hulle 4 sye het, maar nie deur die klas
Disk nie.
Laat die koppelvlak iTetragon
gettors vir al vier sye van die
veelhoek beskryf:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Veronderstel ons het ook die koppelvlak iFigure,
wat ons vroeër reeds geskep het:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Kom ons sorg dat die klas Quadrate
twee koppelvlakke implementeer. Om dit te doen, lys ons
albei koppelvlakke geskei deur kommas na die sleutelwoord
implements:
<?php
class Quadrate implements iFigure, iTetragon
{
// hier sal die implementering wees
}
?>
Kom ons werk nou ons klas Quadrate by,
sodat dit die koppelvlak iTetragon implementeer.
Dit is duidelijk dat ons vierkant 'n gedegenereerde
geval van 'n vierhoek is, aangesien alle sye van 'n vierkant
gelyk is. Dus sal al die nuwe metodes
dieselfde teruggee - die breedte van die vierkant:
<?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;
}
}
?>
Dit is duidelik dat in 'n reghoek nie alle
sye dieselfde is nie, maar slegs teenoorgestelde sye.
In hierdie geval sal die nuwe metodes 'n bietjie
verskil. En in 'n trapesium
sal al 4 sye heeltemal anders wees.
Dit maak egter nie saak watter figuur ons oorweeg nie - wat belangrik is, is dat al hierdie figure die beskryfde metodes sal hê (selfs al is sommige figure gedegenereerd) en eenvormig sal werk.
Sorg dat die klas Rectangle
ook twee koppelvlakke implementeer: beide iFigure,
en iTetragon.
Skep 'n koppelvlak iCircle met metodes
getRadius en getDiameter.
Sorg dat die klas Disk ook
twee koppelvlakke implementeer: beide iFigure,
en iCircle.