PHP-də OOP-də interfeyslerin tetbiqi
Beləliklə, biz artıq müəyyən etdik ki, interfeyslər zəruri olan bütün metodların klassda reallaşdırılmasını idarə etmək üçün yaxşı bir üsuldur.
Gəlin daha bir, daha praktiki misalı nəzərdən keçirək. Tutaq ki, bizdə obyekt-fiqurlar massivini özündə saxlayan bir klass var:
<?php
class FiguresCollection
{
private $figures = []; // fiqurlar üçün massiv
}
?>
Kolleksiyaya obyektlər əlavə etmək üçün bizim klassımızda
addFigure metodunu reallaşdıraq:
<?php
class FiguresCollection
{
private $figures = [];
// Parametr kimi fiqur olan obyekt ötürülür:
public function addFigure($figure)
{
$this->figures[] = $figure;
}
}
?>
Aydındır ki, biz addFigure metodunun parametri kimi
fiqur olan bir obyektin ötürüləcəyini planlaşdırırıq. Lakin
bunun üçün heç bir nəzarət yoxdur!
Gəlin tip üçün işarədən istifadə edək və açıq şəkildə
obyektlərin tipini Figure kimi göstərək:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
}
?>
Gəlin bizim nə etdiyimizlə bağlı anlayaq.
Əgər Figure həqiqətən mövcud olan bir klass olsaydı,
onda biz metodun parametrinə həmin klassın obyektlərini,
həmçinin onun varislərinin obyektlərini ötürə bilərdik.
Lakin bizdə Figure interfeysdir.
Bu halda tip işarəsi o deməkdir ki, metodun parametrinə
yalnız bizim interfeysi reallaşdıran klassların obyektləri
ötürülə bilər.
Gəlin bizim klassımızın obyektini yaradaq və ona fiqurlar əlavə edək:
<?php
$figuresCollection = new FiguresCollection;
// Bir neçə kvadrat əlavə edək:
$figuresCollection->add(new Quadrate(2));
$figuresCollection->add(new Quadrate(3));
// Bir neçə düzbucaqlı əlavə edək:
$figuresCollection->add(new Rectangle(2, 3));
$figuresCollection->add(new Rectangle(3, 4));
?>
Hər hansı başqa bir klassın obyektini əlavə etməyə cəhd xətaya səbəb olacaq:
<?php
$figuresCollection = new FiguresCollection;
class Test {}; // hansısa başqa bir klass
$figuresCollection->add(new Test); // xəta verəcək
?>
Praktikada belə nəzarət bizə nə verir:
kolleksiyaya əlavə olunan bütün fiqurlar
Figure interfeysini reallaşdırdığı üçün,
biz əmin ola bilərik ki, onların hər birində
getSquare metodu və
getPerimeter metodu olacaq.
Mümkündür ki, gələcəkdə kvadrat və düzbucaqlıdan əlavə,
məsələn, həm də üçbucaq peyda olacaq. Bu
halda üçbucağın da getSquare və
getPerimeter metodları olacaq.
Praktikada bu bizə aşağıdakıları verir: biz
FiguresCollection klassında, məsələn,
kolleksiyanın bütün fiqurlarının ümumi sahəsini tapan
getTotalSquare metodu edə bilərik. Bu metodda
biz fiqurlar massivini tsikl ilə dolaşacaq və
hər bir fiqurun getSquare metodunu çağıracağıq.
Hər bir fiqur Figure interfeysini reallaşdırdığı üçün,
biz 100% əmin ola bilərik ki, hər bir fiqurda
bu getSquare metodu olacaq.
Beləliklə, metodun reallaşdırılması:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
// Ümumi sahəni tapaq:
public function getTotalSquare()
{
$sum = 0;
foreach ($this->figures as $figure) {
$sum += $figure->getSquare(); // getSquare metodundan istifadə edirik
}
return $sum;
}
}
?>
Mənim koduma baxmadan eyni FiguresCollection
klassını reallaşdırın.
FiguresCollection klassına
bütün fiqurların ümumi perimetrini tapmaq üçün
getTotalPerimeter metodunu əlavə edin.