2 回答

TA貢獻1898條經(jīng)驗 獲得超8個贊
它確實違反了SOLID規(guī)則。您聲明Car::setEngine接受一個類型的參數(shù)Engine,但子級WaterCar::setEngine接受一個類型的參數(shù)HydroEngine。即使HydroEngine是的子類型Engine,它仍然是不同的類型。
當(dāng)上課的時候Foo implements WaterCar,上課也是正確的instanceof Car。但是Foo::setEngine接受一個HydroEngine,但是不接受一個Engine。因此,F(xiàn)oo::setEngine據(jù)推測implements Car,但不接受type參數(shù)Engine。這打破了Liskov替代原則。您不能在子接口,周期中更改參數(shù)的類型。
繼承的關(guān)鍵字是明確的extends。子類與父類完全相同,甚至可能更多。它不能做的比父項少。既然HydroEngine是一個專門亞型Engine,這將意味著一個WaterCar不小于比Car,因為它只接受的更窄的亞型Engine。例如:
function (Car $car) {
$engine = new EngineImplementation;
$car->setEngine($engine);
}
如果您傳入,則上面的代碼會崩潰WaterCar,因為它不接受Engine。

TA貢獻1936條經(jīng)驗 獲得超7個贊
我認(rèn)為方法簽名仍然需要完全相同,因為在編譯時,如果HydroEngine是Engine,則無法解決。
interface WaterCar extends Car {
function setEngine(Engine $engine);
}
- 2 回答
- 0 關(guān)注
- 353 瀏覽
添加回答
舉報