Več vmesnikov v OOP v PHP
V PHP ni večkratnega dedovanja - vsak
razred ima lahko samo enega starša.
Z vmesniki pa je drugače:
vsak razred lahko implementira poljubno število
vmesnikov. Za to je treba imena vmesnikov
našteti z vejico za ključno
besedo implements.
To kaže še eno razliko med vmesniki in abstraktnimi razredi - lahko implementiramo več vmesnikov, vendar več abstraktnih razredov ni mogoče podedovati.
Poskusimo v praksi. Naj poleg
vmesnika iFigure obstaja tudi
vmesnik iTetragon.
Metode tega vmesnika bodo implementirali
razredi Quadrate in Rectangle,
ker imajo 4 stranice, razred
Disk pa ne.
Naj vmesnik iTetragon opiše
getterje za vse štiri stranice
štirikotnika:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Naj imamo tudi vmesnik iFigure,
ki smo ga že naredili prej:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Naredimo tako, da razred Quadrate
implementira dva vmesnika. Za to naštejemo
oba vmesnika z vejico za ključno
besedo implements:
<?php
class Quadrate implements iFigure, iTetragon
{
// tukaj bo implementacija
}
?>
Sedaj dopolnimo naš razred Quadrate,
tako da bo implementiral vmesnik iTetragon.
Jasno je, da je naš kvadrat degeneriran
primer štirikotnika, saj ima kvadrat
vse stranice enake. Zato bodo vse nove metode
vračale isto - širino kvadrata:
<?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;
}
}
?>
Očitno v pravokotniku niso vse
stranice enake, ampak le nasprotne.
V tem primeru se bodo nove metode nekoliko
razlikovale. No, in v nekem trapezu
pa bodo vse 4 stranice povsem različne.
Vendar ni pomembno, katero figuro obravnavamo - pomembno je, da bodo vse te figure imele opisane metode (četudi so nekatere figure degenerirane) in delovale enotno.
Naredite tako, da razred Rectangle
prav tako implementira dva vmesnika: iFigure
in iTetragon.
Naredite vmesnik iCircle z metodama
getRadius in getDiameter.
Naredite tako, da razred Disk prav tako
implementira dva vmesnika: iFigure
in iCircle.