Flera gränssnitt i OOP i PHP

I PHP finns det inget multipelt arv - varje klass kan bara ha en förälder. Med gränssnitt är det dock annorlunda: varje klass kan implementera valfritt antal gränssnitt. För detta ska gränssnittens namn listas efter nyckelordet implements, separerade med kommatecken.

Detta visar en annan skillnad mellan gränssnitt och abstrakta klasser - man kan implementera många gränssnitt, men man kan inte ärva flera abstrakta klasser.

Låt oss prova i praktiken. Antag att förutom gränssnittet iFigure så har vi också gränssnittet iTetragon. Metoderna i detta gränssnitt kommer att implementeras av klasserna Quadrate och Rectangle, eftersom de har 4 sidor, men inte klassen Disk.

Låt gränssnittet iTetragon beskriva getters för alla fyra sidorna på en fyrhörning:

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

Antag också att vi har gränssnittet iFigure, som vi redan skapat tidigare:

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

Låt oss se till att klassen Quadrate implementerar två gränssnitt. För detta listar vi båda gränssnitten efter nyckelordet implements, separerade med kommatecken:

Quadrate.php<?php
  class Quadrate implements iFigure, iTetragon
  {
    // implementation kommer här
  }
?>

Låt oss nu utveckla vår klass Quadrate, så att den implementerar gränssnittet iTetragon. Det är tydligt att vår kvadrat är ett degenererat fall av en fyrhörning, eftersom alla sidor i en kvadrat är lika. Därför kommer alla nya metoder att returnera samma sak - kvadratens bredd:

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;
    }
  }
?>

Uppenbarligen är inte alla sidor lika i en rektangel, bara de motsatta sidorna. I det här fallet kommer de nya metoderna att skilja sig något. Och i till exempel en trapets kommer alla 4 sidor att vara olika.

Men det spelar ingen roll vilken figur vi betraktar - det viktiga är att alla dessa figurer kommer att ha de beskrivna metoderna (även om vissa figurer är degenererade) och fungera på ett enhetligt sätt.

Задание 1

Se till att klassen Rectangle också implementerar två gränssnitt: både iFigure, och iTetragon.

Задание 2

Skapa gränssnittet iCircle med metoderna getRadius och getDiameter.

Задание 3

Se till att klassen Disk också implementerar två gränssnitt: både iFigure, och iCircle.