2012-01-14 3 views
5

PHP OOP와 타입 힌트에 이상한 문제가 있습니다. method 인터페이스 선언과 호환되지 않는다는 말,PHP OOP "구현이 호환되어야합니다."

abstract class AC {} 

class C extends AC {} 

interface I { 
    function method(AC $abstract); 
} 

class InterfaceImplementation implements I { 
    function method(C $concrete) {} 
} 

이 코드는 실행되지 않습니다 예를 들면 다음과 같습니다이다. C가 AC를 확장 한 이후로는 호환 가능하다고 생각할 것입니다. 이러한 종류의 기능을 구현하려면 어떻게해야합니까?

+4

'인터페이스 I'는'메소드'가'C'가 아닌'AC'를 허용한다는 것을 의미합니다 ...'InterfaceImplementation'은 사실 'I'을 구현하십시오. – Wrikken

답변

4

B 또한 AC까지 확장되는 클래스가 있다고 상상해보십시오. 그런 다음 I은 해당 구현 중 B을 메소드의 인수로 허용해야합니다. 그러나 InterfaceImplementation은 그렇지 않습니다.

큰 그림 : 구현에 구체적인 유형을 지정해야하는 경우 디자인을 다시 고려하고 싶을 수 있습니다. 외부 세계에 알려지기 위해서는 AC으로 인코딩해야하며 어떤 구체적인 하위 클래스가 전송되는지 알 필요가있는 InterfaceImplementation이 없어야합니다. 아마 특정 물건 AC?

또 다른 업데이트로 노출하는 방법을 통해 C의 코드에 포함하고 일반적으로 호출 할 수 있습니다 : 당신은 당신이 제네릭을 사용하여 원하는 것을 달성 할 수있을 수도 있지만, 나는 그들이 존재 생각하지 않는다 PHP.

class InterfaceImplementation implements I { 
    function method(AC $concrete) {} 
} 

그리고 즉 C의 인스턴스로 전화 : 다른 흥미로운 질문 :

+1

'B'를 받아 들일 것입니다.'B'가'AC'를 확장한다는 것을 제외하면, 올바른 경우입니다. – Wrikken

+0

설명해 주셔서 감사합니다. – Fluffy

+0

죄송 합니다만 "extebs AC"가 "extend C"가 아니란 뜻입니다 - 고정 – Nicolas78

1

단지로 정의 할 수있는 설계 문제의 세부 사항을 공유하는 경우 나는 아직도 생각합니다. ->method(new C());. Object Interfaces

PHP의 참조 설명서는 명확 상태 :

인터페이스에 정의 된 바와 같은 동일한 방법 서명을 사용해야하는 인터페이스를 구현하는 클래스입니다. 그렇게하지 않으면 치명적인 오류가 발생합니다.

+0

고정되어 있지만 C 인수 만 받아들이도록 InterfaceImplementation을 제한하려고합니다. – Nicolas78