하위 인터페이스로 인터페이스 메서드 매개변수 재정의
주어진 PHP 코드에서 Car 인터페이스의 setEngine 메서드를 재정의하려고 시도했습니다. 하위 인터페이스 WaterCar에 보다 구체적인 매개변수 유형을 사용합니다. 그러나 이로 인해 치명적인 오류가 발생합니다.
<code class="php">Fatal error: Declaration of WaterCar::setEngine() must be compatible with Car::setEngine(Engine $engine)</code>
오류 설명
이 오류는 Liskov 대체 원칙(LSP)을 위반하여 발생합니다. 하위 유형은 상위 유형을 대체할 수 있어야 합니다. 이 경우 WaterCar 인터페이스는 Car 인터페이스의 하위 유형이지만 WaterCar의 setEngine 메소드는 Car(Engine)의 해당 메소드와 다른 매개변수 유형(HydroEngine)을 갖습니다.
이로 인해 호환성 문제가 발생합니다. . WaterCar 인터페이스를 구현하는 클래스는 Car 객체를 기대하는 함수에 인수로 전달되지 않을 수 있습니다. setEngine 메소드가 Engine 매개변수를 허용하지 않기 때문입니다. 따라서 하위 클래스는 상위 클래스의 모든 요구 사항을 충족하지 못하여 LSP를 위반합니다.
해결 방법
이 문제를 해결하려면 WaterCar 인터페이스의 setEngine 메서드를 사용해야 합니다. Car 인터페이스의 메소드와의 호환성을 유지합니다. 이는 동일한 매개변수 유형(Engine)을 유지하거나 Vehicle과 같이 Engine을 포함하는 보다 일반적인 유형을 제공하는 것을 의미합니다.
<code class="php">interface WaterCar extends Car { function setEngine(Vehicle $engine); }</code>
이 변경으로 WaterCar를 구현하는 모든 클래스는 Car가 사용되는 위치에서 계속 사용할 수 있습니다. 이제 동일하거나 더 일반적인 유형의 매개변수를 허용하므로 예상됩니다.
위 내용은 하위 인터페이스가 보다 구체적인 유형으로 인터페이스 메서드 매개 변수를 재정의할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!