Повеќе интерфејси во ООП во PHP
Во PHP не постои множечно наследување - секоја
класа може да има само еден родител.
Со интерфејсите, сепак, работите се поинаку:
секоја класа може да имплементира било кој број
интерфејси. За ова, имињата на интерфејсите
треба да се наведат разделени со запирка после клучниот
збор implements.
Ова е уште една разлика помеѓу интерфејсите и апстрактните класи - може да се имплементираат многу интерфејси, но не може да се наследат повеќе апстрактни класи.
Ајде да испробаме во пракса. Нека покрај
интерфејсот iFigure имаме и
интерфејс iTetragon.
Методите на овој интерфејс ќе ги имплементираат
класите Quadrate и Rectangle,
бидејќи тие имаат 4 страни, но не и класата
Disk.
Нека интерфејсот iTetragon опишува
геттери за сите четири страни
на четириаголникот:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Нека имаме и интерфејс iFigure,
кој го создадовме претходно:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Ајде да направиме класата Quadrate
да имплементира два интерфејси. За ова, ги наведуваме
двата интерфејси разделени со запирка после клучниот
збор implements:
<?php
class Quadrate implements iFigure, iTetragon
{
// овде ќе биде имплементацијата
}
?>
Сега да ја доработиме нашата класа Quadrate,
така што ќе го имплементира интерфејсот iTetragon.
Јасно е дека нашиот квадрат е дегенериран
случај на четириаголник, бидејќи кај квадратот
сите страни се еднакви. Затоа сите нови методи
ќе враќаат исто - ширината на квадратот:
<?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;
}
}
?>
Очигледно е дека кај правоаголникот веќе не се
сите страни исти, туку само спротивните.
Во овој случај, новите методи ќе се разликуваат малку.
И, кај некоја трапезоид
воопшто сите 4 страни ќе бидат различни.
Сепак, не е важно каква фигура ќе ја разгледуваме - битно е што сите овие фигури ќе ги имаат опишаните методи (нека некои фигури и да се дегенерирани) и ќе работат на ист начин.
Направете класата Rectangle
да имплементира два интерфејси: и iFigure,
и iTetragon.
Создадете интерфејс iCircle со методи
getRadius и getDiameter.
Направете класата Disk да
имплементира два интерфејси: и iFigure,
и iCircle.