Vairāki interfeisi OOP PHP
PHP nav daudzkārtējas mantojums - katrai
klasei var būt tikai viens vecāks.
Tomēr ar interfeisiem situācija ir citāda:
katra klase var implementēt jebkādu skaitu
interfeisu. Lai to izdarītu, interfeisu nosaukumi
jāuzskaita ar komatiem aiz atslēgvārda
implements.
Tas ir vēl viens atšķirības punkts starp interfeisiem un abstraktajām klasēm - var implementēt daudzus interfeisus, bet vairākas abstraktās klases nevar mantot.
Izmēģināsim to praksē. Pieņemsim, ka papildus
interfeisam iFigure mums ir arī
interfeiss iTetragon.
Šī interfeisa metodes implementēs
klases Quadrate un Rectangle,
jo tām ir 4 malas, bet ne klase
Disk.
Lai interfeiss iTetragon apraksta
getterus visām četrām četrstūra
malām:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Pieņemsim arī, ka mums ir interfeiss iFigure,
ko mēs jau izveidojām iepriekš:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Padarīsim tā, lai klase Quadrate
implementētu divus interfeisus. Lai to izdarītu, uzskaitīsim
abus interfeisus ar komatiem aiz atslēgvārda
implements:
<?php
class Quadrate implements iFigure, iTetragon
{
// šeit būs implementācija
}
?>
Tagad izstrādāsim mūsu klasi Quadrate tālāk,
lai tā implementētu interfeisu iTetragon.
Skaidrs, ka mūsu kvadrāts ir deģenerēts
četrstūra gadījums, jo kvadrātam
visas malas ir vienādas. Tāpēc visas jaunās metodes
atgriezīs to pašu - kvadrāta platumu:
<?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;
}
}
?>
Acīmredzot taisnstūrī jau ne visas
malas ir vienādas, bet tikai pretējās.
Šajā gadījumā jaunās metodes kļūs nedaudz
atšķirīgas. Un, piemēram, trapecē
parasti visas 4 malas būs dažādas.
Tomēr nav svarīgi, kāda figūra tiks aplūkota - svarīgi, ka visas šīs figūras būs aprakstītās metodes (lai gan dažas figūras ir deģenerētas) un darbosies vienveidīgi.
Izdariet tā, lai klase Rectangle
arī implementētu divus interfeisus: gan iFigure,
gan iTetragon.
Izveidojiet interfeisu iCircle ar metodēm
getRadius un getDiameter.
Izdariet tā, lai klase Disk arī
implementētu divus interfeisus: gan iFigure,
gan iCircle.