重寫介面方法參數:Liskov 取代違規案例
在PHP 中,你可能會遇到這樣的情況:用以下指令重寫介面方法參數子介面會導致錯誤。考慮以下程式碼:
<code class="php">interface Engine { function run(); } interface HydroEngine extends Engine { function run(); } interface Car { function setEngine(Engine $engine); } interface WaterCar extends Car { function setEngine(HydroEngine $engine); }</code>
不幸的是,此程式碼會產生錯誤:
Fatal error: Declaration of WaterCar::setEngine() must be compatible with Car::setEngine(Engine $engine)
錯誤原因
發生錯誤因為透過重寫WaterCar 介面中的setEngine 方法,您違反了里氏替換原則。該原則規定,子類別應該可以替代其父類,而不會破壞程式的行為。
WaterCar 介面作為 Car 的子類,必須接受與父介面的 setEngine 方法相同的參數類型,即引擎。透過使用 HydroEngine 覆蓋它,您可以縮小可接受的參數類型,從而使 WaterCar 的可替代性低於 Car。
解決方案
要解決此問題,您必須確保介面的子類別遵循與父介面相同的參數類型。在這種情況下,您不應重寫 WaterCar 介面中的 setEngine 方法,而應繼承 Car 介面的定義。
以上是用子介面覆蓋介面方法參數是否違反了里氏替換原則?的詳細內容。更多資訊請關注PHP中文網其他相關文章!