PHP OOP에서 여러 인터페이스
PHP는 다중 상속을 지원하지 않습니다. 각
클래스는 오직 하나의 부모 클래스만 가질 수 있습니다.
그러나 인터페이스의 경우 상황이 다릅니다:
각 클래스는 임의의 개수의 인터페이스를
구현할 수 있습니다. 이를 위해 인터페이스 이름들을
키워드 implements 뒤에 쉼표로 구분하여
나열하면 됩니다.
이는 인터페이스와 추상 클래스의 또 다른 차이점을 보여줍니다 - 여러 인터페이스를 구현할 수는 있지만, 여러 추상 클래스를 상속받을 수는 없습니다.
실제로 시도해 봅시다. iFigure 인터페이스 외에
iTetragon 인터페이스도 있다고 가정해 보겠습니다.
이 인터페이스의 메서드는 Quadrate 클래스와
Rectangle 클래스에 의해 구현될 것입니다,
왜냐하면 그들은 4개의 변을 가지지만, Disk
클래스는 그렇지 않기 때문입니다.
iTetragon 인터페이스가
사각형의 모든 네 변에 대한
게터(getter)를 설명한다고 가정해 봅시다:
<?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 클래스가
두 인터페이스를 구현하도록 만들어 봅시다. 이를 위해
키워드 implements 뒤에
두 인터페이스를 쉼표로 구분하여 나열합니다:
<?php
class Quadrate implements iFigure, iTetragon
{
// 여기에 구현이 들어갑니다
}
?>
이제 Quadrate 클래스가 iTetragon 인터페이스를
구현하도록 수정해 봅시다.
우리의 정사각형은 퇴화된(degenerate)
사각형의 경우라는 것이 명백합니다, 왜냐하면 정사각형의
모든 변은 같기 때문입니다. 따라서 모든 새로운 메서드들은
동일한 것 - 정사각형의 너비 - 을 반환할 것입니다:
<?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 클래스도 두 인터페이스:
iFigure와 iTetragon를 구현하도록
만들어 보세요.
getRadius 및 getDiameter 메서드를 가진
iCircle 인터페이스를 만들어 보세요.
Disk 클래스도 두 인터페이스:
iFigure와 iCircle를 구현하도록 만들어 보세요.