PHPのOOPにおける複数のインターフェース

PHPには多重継承はありません - 各クラスは一つの親クラスしか持つことができません。 しかし、インターフェースについては事情が異なります: 各クラスは任意の数のインターフェースを実装できます。 そのためには、インターフェース名をキーワード implements の後にカンマで区切って列挙します。

これは、インターフェースと抽象クラスのもう一つの違いを示しています - 多くのインターフェースを実装することはできますが、複数の抽象クラスを継承することはできません。

実際に試してみましょう。インターフェース iFigure の他に、インターフェース iTetragon があるとします。 このインターフェースのメソッドは、 Quadrate クラスと Rectangle クラスによって実装されます(これらのクラスには 4 つの辺があります)が、 Disk クラスでは実装されません。

インターフェース iTetragon は、四角形のすべての4辺に対するゲッターを記述するとします:

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 クラスが2つのインターフェースを実装するようにしましょう。 そのためには、キーワード 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 クラスも2つのインターフェースを実装するようにしてください: iFigure と iTetragon の両方です。

Задание 2

メソッド getRadius と getDiameter を持つインターフェース iCircle を作成してください。

Задание 3

Disk クラスも2つのインターフェースを実装するようにしてください: iFigure と iCircle の両方です。