重寫方法中的參數協方差
在物件導向程式設計中,重寫方法允許子類別實現超類別中定義的方法的自己版本。但是,當重寫方法時,參數和傳回類型必須與超類別方法的聲明相容。
在給定的程式碼中,我們有一個具有以下介面的場景:
類別的類似結構:
嘗試重寫setEngine( ) 時會出現問題WaterCar:
出現這個錯誤是因為WaterCar中setEngine()的參數類型是HydroEngine,是Engine的子類型,而超類Car中的參數類型是Engine。
里氏替換原理 (LSP) 管理此類場景。 LSP 規定子類型(例如 HydroEngine)必須可以取代其超類型(例如 Engine),而不會破壞程式的功能。然而,這個原則不適用於重寫方法中的參數類型。
在這種情況下,WaterCar 並沒有完全實現 Car,因為它在 setEngine() 中接受更窄的參數類型。這是因為 WaterCar 只能接受 HydroEngines,而 Car 可以接受任何引擎。這違反了 LSP 並破壞了超類別 Car 建立的契約。
要解決此問題,請確保重寫方法中的參數類型與超類別的聲明相容。在此範例中,WaterCar::setEngine() 可以修改如下:
此修改保持了與 Car::setEngine() 的兼容性,同時允許 WaterCar 專門接受 HydroEngine。
以上是為什麼我不能在重寫方法的參數中使用子類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!