Interfaces Nyingi katika OOP katika PHP
Katika PHP hakuna urithi mwingi - kila
class inaweza kuwa na mzazi mmoja tu.
Hata hivyo, kwa interfaces, hali ni tofauti:
kila class inaweza kutekeleza idadi yoyote
ya interfaces. Ili kufanya hivyo, majina ya interfaces
yanahitaji kuorodheshwa kwa kutumia koma baada ya neno muhimu
implements.
Hii ni tofauti nyingine kati ya interfaces na abstract classes - unaweza kutekeleza interfaces nyingi, lakini huwezi kurithi abstract classes nyingi.
Tujaribu kwa vitendo. Hebu tuseme badala ya
interface iFigure tunayo pia
interface iTetragon.
Mbinu za interface hii zitatekelezwa na
classes Quadrate na Rectangle,
kwa sababu zina pande 4, lakini si class
Disk.
Hebu interface iTetragon ichafue
getters kwa pande zote nne
za pembe-nne:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Hebu tuseme pia tuna interface iFigure,
ambayo tuliwahi kutengeneza hapo awali:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Hebu tufanye class Quadrate
itekeleze interfaces mbili. Ili kufanya hivyo, tuorodheshe
interfaces zote mbili kwa kutumia koma baada ya neno muhimu
implements:
<?php
class Quadrate implements iFigure, iTetragon
{
// utekelezaji utakuwa hapa
}
?>
Hebu sasa tuboreshe class yetu Quadrate,
ili itekeleze interface iTetragon.
Ni wazi kuwa mraba wetu ni kesi maalum
ya pembe-nne, kwa sababu katika mraba
pande zote ni sawa. Kwa hivyo mbinu zote mpya
zitarudisha kitu kimoja - upana wa mraba:
<?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;
}
}
?>
Ni wazi kuwa katika mstatili sio
pande zote ni sawa, lakini tu pande zinazokabiliana.
Katika kesi hii, mbinu mpya zitakuwa tofauti
kidogo. Na, katika trapezoid yoyote
kwa ujumla pande zote 4 zitakuwa tofauti.
Hata hivyo, haijalishi ni umbo gani tutakalochunguza - muhimu ni kwamba maumbo haya yote yatakuwa na mbinu zilizoelezewa (ingawa baadhi ya maumbo ni maalum) na kufanya kazi kwa namna ile ile.
Fanya class Rectangle
pia itekeleze interfaces mbili: iFigure,
na iTetragon.
Tengeneza interface iCircle na mbinu
getRadius na getDiameter.
Fanya class Disk pia
itekeleze interfaces mbili: iFigure,
na iCircle.