>백엔드 개발 >PHP 튜토리얼 >하위 인터페이스가 보다 구체적인 유형으로 인터페이스 메서드 매개 변수를 재정의할 수 있습니까?

하위 인터페이스가 보다 구체적인 유형으로 인터페이스 메서드 매개 변수를 재정의할 수 있습니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-07 10:45:03931검색

Can Child Interfaces Override Interface Method Parameters with More Specific Types?

하위 인터페이스로 인터페이스 메서드 매개변수 재정의

주어진 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.