PHP OOP에서 여러 인터페이스

PHP는 다중 상속을 지원하지 않습니다. 각 클래스는 오직 하나의 부모 클래스만 가질 수 있습니다. 그러나 인터페이스의 경우 상황이 다릅니다: 각 클래스는 임의의 개수의 인터페이스를 구현할 수 있습니다. 이를 위해 인터페이스 이름들을 키워드 implements 뒤에 쉼표로 구분하여 나열하면 됩니다.

이는 인터페이스와 추상 클래스의 또 다른 차이점을 보여줍니다 - 여러 인터페이스를 구현할 수는 있지만, 여러 추상 클래스를 상속받을 수는 없습니다.

실제로 시도해 봅시다. iFigure 인터페이스 외에 iTetragon 인터페이스도 있다고 가정해 보겠습니다. 이 인터페이스의 메서드는 Quadrate 클래스와 Rectangle 클래스에 의해 구현될 것입니다, 왜냐하면 그들은 4개의 변을 가지지만, Disk 클래스는 그렇지 않기 때문입니다.

iTetragon 인터페이스가 사각형의 모든 네 변에 대한 게터(getter)를 설명한다고 가정해 봅시다:

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 인터페이스를 구현하도록 수정해 봅시다. 우리의 정사각형은 퇴화된(degenerate) 사각형의 경우라는 것이 명백합니다, 왜냐하면 정사각형의 모든 변은 같기 때문입니다. 따라서 모든 새로운 메서드들은 동일한 것 - 정사각형의 너비 - 을 반환할 것입니다:

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

getRadius 및 getDiameter 메서드를 가진 iCircle 인터페이스를 만들어 보세요.

Задание 3

Disk 클래스도 두 인터페이스: iFigure와 iCircle를 구현하도록 만들어 보세요.