PHP-də OOP-də Bir neçə interfeys
PHP-də çoxsaylı irsiyyət yoxdur - hər bir
sinif yalnız bir valideynə malik ola bilər.
Lakin, interfeyslər bu baxımdan fərqlidir:
hər bir sinif istənilən sayda interfeysi
reallaşdıra bilər. Bunun üçün interfeys adlarını
implements açar sözündən sonra vergüllə
ayıraraq sadalamaq lazımdır.
Bu, interfeyslərin abstrakt siniflərdən daha bir fərqidir - bir çox interfeysi reallaşdırmaq olar, amma bir neçə abstrakt sinifi miras almaq olmaz.
Gəlin praktikada sınayaq. Tutaq ki, iFigure
interfeysindən əlavə, iTetragon interfeysi də
var.
Bu interfeysin metodları Quadrate və Rectangle
sinifləri tərəfindən reallaşdırılacaq,
çünki onların 4 tərəfi var, amma Disk
sinifi tərəfindən yox.
Tutaq ki, iTetragon interfeysi
dördbucaqlının bütün dörd tərəfi üçün
getter-ları təsvir edir:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Tutaq ki, əvvəllər etdiyimiz iFigure
interfeysi də var:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Gəlin Quadrate sinifinin
iki interfeysi reallaşdırmasını təmin edək. Bunun üçün
hər iki interfeysi implements açar
sözündən sonra vergüllə ayıraraq sadalayaq:
<?php
class Quadrate implements iFigure, iTetragon
{
// burada reallaşdırma olacaq
}
?>
İndi Quadrate sinifimizi iTetragon
interfeysini reallaşdıracaq şəkildə işləyək.
Aydındır ki, kvadratımız dördbucaqlının degenerasiyaya uğramış
halıdır, çünki kvadratın
bütün tərəfləri bərabərdir. Buna görə də bütün yeni metodlar
eyni şeyi qaytaracaq - kvadratın eni:
<?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;
}
}
?>
Aydındır ki, düzbucaqlıda artıq bütün
tərəflər eyni deyil, yalnız qarşılıqlı tərəflər
eynidir.
Bu halda yeni metodlar bir az
fərqlənəcək. Yaxud hər hansı bir trapesiyada
ümumiyyətlə bütün 4 tərəf fərqli olacaq.
Lakin, hansı fiquru nəzərdən keçirdiyimizin əhəmiyyəti yoxdur - vacib olan odur ki, bütün bu fiqlər təsvir olunmuş metodlara malik olacaq (baxmayaraq ki, bəzi fiqurlar degenerasiyaya uğramış ola bilər) və eyni tipli işləyəcək.
Rectangle sinifinin də iki interfeysi reallaşdırmasını təmin edin: həm iFigure,
həm də iTetragon.
getRadius və getDiameter metodları olan
iCircle interfeysini yaradın.
Disk sinifinin də iki interfeysi reallaşdırmasını təmin edin: həm iFigure,
həm də iCircle.