PHPのOOPにおける複数のインターフェース
PHPには多重継承はありません - 各クラスは一つの親クラスしか持つことができません。
しかし、インターフェースについては事情が異なります:
各クラスは任意の数のインターフェースを実装できます。
そのためには、インターフェース名をキーワード implements の後にカンマで区切って列挙します。
これは、インターフェースと抽象クラスのもう一つの違いを示しています - 多くのインターフェースを実装することはできますが、複数の抽象クラスを継承することはできません。
実際に試してみましょう。インターフェース iFigure の他に、インターフェース iTetragon があるとします。
このインターフェースのメソッドは、 Quadrate クラスと Rectangle クラスによって実装されます(これらのクラスには 4 つの辺があります)が、 Disk クラスでは実装されません。
インターフェース iTetragon は、四角形のすべての4辺に対するゲッターを記述するとします:
<?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 クラスが2つのインターフェースを実装するようにしましょう。
そのためには、キーワード 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 クラスも2つのインターフェースを実装するようにしてください: iFigure と iTetragon の両方です。
メソッド getRadius と getDiameter を持つインターフェース iCircle を作成してください。
Disk クラスも2つのインターフェースを実装するようにしてください: iFigure と iCircle の両方です。