Повеќе интерфејси во ООП во PHP

Во PHP не постои множечно наследување - секоја класа може да има само еден родител. Со интерфејсите, сепак, работите се поинаку: секоја класа може да имплементира било кој број интерфејси. За ова, имињата на интерфејсите треба да се наведат разделени со запирка после клучниот збор implements.

Ова е уште една разлика помеѓу интерфејсите и апстрактните класи - може да се имплементираат многу интерфејси, но не може да се наследат повеќе апстрактни класи.

Ајде да испробаме во пракса. Нека покрај интерфејсот iFigure имаме и интерфејс iTetragon. Методите на овој интерфејс ќе ги имплементираат класите Quadrate и Rectangle, бидејќи тие имаат 4 страни, но не и класата Disk.

Нека интерфејсот iTetragon опишува геттери за сите четири страни на четириаголникот:

iTetragon.php<?php
  interface iTetragon
  {
    public function getA();
    public function getB();
    public function getC();
    public function getD();
  }
?>

Нека имаме и интерфејс iFigure, кој го создадовме претходно:

iFigure.php<?php
  interface iFigure
  {
    public function getSquare();
    public function getPerimeter();
  }
?>

Ајде да направиме класата Quadrate да имплементира два интерфејси. За ова, ги наведуваме двата интерфејси разделени со запирка после клучниот збор implements:

Quadrate.php<?php
  class Quadrate implements iFigure, iTetragon
  {
    // овде ќе биде имплементацијата
  }
?>

Сега да ја доработиме нашата класа Quadrate, така што ќе го имплементира интерфејсот iTetragon. Јасно е дека нашиот квадрат е дегенериран случај на четириаголник, бидејќи кај квадратот сите страни се еднакви. Затоа сите нови методи ќе враќаат исто - ширината на квадратот:

Quadrate.php<?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 страни ќе бидат различни.

Сепак, не е важно каква фигура ќе ја разгледуваме - битно е што сите овие фигури ќе ги имаат опишаните методи (нека некои фигури и да се дегенерирани) и ќе работат на ист начин.

Задание 1

Направете класата Rectangle да имплементира два интерфејси: и iFigure, и iTetragon.

Задание 2

Создадете интерфејс iCircle со методи getRadius и getDiameter.

Задание 3

Направете класата Disk да имплементира два интерфејси: и iFigure, и iCircle.