이미 추상 클래스가 있다면 왜 인터페이스가 필요한가?
다중 상속을 방지하려면 (여러 알려진 문제가 발생할 수 있음)
그러한 문제 중 하나 :
"다이아몬드 문제"(때때로 "치명적인 죽음의 다이아몬드"라고도 함)는 두 클래스 B와 C가 A에서 상속되고 클래스 D가 B와 C에서 모두 상속 될 때 발생하는 모호성입니다. B와 C가 재정의되었고 D가이를 재정의하지 않고 D가 어떤 버전의 메소드를 상속합니까? B의 버전입니까, C의 버전입니까?
출처 : https://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem
왜 / 언제 인터페이스를 사용해야합니까?
예는 ... 세계의 모든 자동차가 동일한 인터페이스 (방법)을 가지고 ... AccelerationPedalIsOnTheRight()
, BrakePedalISOnTheLeft()
. 각 자동차 브랜드에 이러한 "방법"이 다른 브랜드와 다를 것이라고 상상해보십시오. BMW는 오른쪽에 브레이크가 있고 Honda는 휠 왼쪽에 브레이크가 있습니다. 사람들은 다른 브랜드의 자동차를 구입할 때마다 이러한 "방법"이 어떻게 작동 하는지를 배워야했습니다. 따라서 여러 "장소"에서 동일한 인터페이스를 사용하는 것이 좋습니다.
인터페이스는 어떤 역할을합니까 (왜 누군가 인터페이스를 사용합니까)? 인터페이스는 "실수"를 방지합니다 (특정 인터페이스를 구현하는 모든 클래스에는 인터페이스에있는 메소드가 모두 포함됨).
// Methods inside this interface must be implemented in all classes which implement this interface.
interface IPersonService
{
public function Create($personObject);
}
class MySqlPerson implements IPersonService
{
public function Create($personObject)
{
// Create a new person in MySql database.
}
}
class MongoPerson implements IPersonService
{
public function Create($personObject)
{
// Mongo database creates a new person differently then MySQL does. But the code outside of this method doesn't care how a person will be added to the database, all it has to know is that the method Create() has 1 parameter (the person object).
}
}
이 Create()
방법은 항상 같은 방식으로 사용됩니다. 우리가 MySqlPerson
클래스를 사용하는지 또는 클래스를 사용하는지는 중요하지 않습니다 MongoPerson
. 메소드를 사용하는 방법은 동일하게 유지됩니다 (인터페이스는 동일하게 유지됨).
예를 들어, 코드의 어느 곳에서나 다음과 같이 사용됩니다.
new MySqlPerson()->Create($personObject);
new MongoPerson()->Create($personObject);
이런 식으로 이런 일이 일어날 수 없습니다 :
new MySqlPerson()->Create($personObject)
new MongoPerson()->Create($personsName, $personsAge);
하나의 인터페이스를 기억하고 여러 개의 다른 인터페이스보다 동일한 인터페이스를 사용하는 것이 훨씬 쉽습니다.
이런 식으로, Create()
이 메소드를 호출하는 "외부"코드에 영향을주지 않고 메소드 내부가 클래스마다 다를 수 있습니다. 외부 코드는 메소드 Create()
가 1 개의 매개 변수 ( $personObject
)를가집니다. 외부 코드가 메소드를 사용 / 호출하는 방식이기 때문입니다. 외부 코드는 메소드 내부에서 일어나는 일을 신경 쓰지 않습니다. 사용 / 호출 방법 만 알고 있으면됩니다.
인터페이스 없이도이 작업을 수행 할 수 있지만 인터페이스를 사용하는 경우 "safer"(실수하지 않기 때문에)입니다. 인터페이스 Create()
는 인터페이스를 구현하는 모든 클래스에서 메소드 가 동일한 서명 (동일한 유형 및 동일한 수의 매개 변수)을 갖도록합니다. 이렇게하면 IPersonService
인터페이스 를 구현하는 모든 클래스가 메소드 Create()
(이 예제에서)를 가지며 $personObject
호출 / 사용되는 매개 변수가 하나만 필요 하다는 것을 확신 할 수 있습니다 .
인터페이스를 구현하는 클래스는 인터페이스가 가지고 있거나 가지고있는 모든 메소드를 구현해야합니다.
나는 나 자신을 너무 많이 반복하지 않기를 바랍니다.