第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

怎么用子接口作為新參數(shù)覆蓋方法參數(shù)

怎么用子接口作為新參數(shù)覆蓋方法參數(shù)

PHP
回首憶惘然 2020-01-06 08:04:47
我不知道為什么此代碼在PHP中不起作用?<?phpinterface Engine {    function run();}interface HydroEngine extends Engine {    function run();}interface Car {    function setEngine(Engine $engine);}interface WaterCar extends Car {    function setEngine(HydroEngine $engine);}?>看來它沒有違反任何OOP規(guī)則,但是為什么它給我一個錯誤?Fatal error: Declaration of WaterCar::setEngine() must be compatible with Car::setEngine(Engine $engine)
查看完整描述

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。



查看完整回答
反對 回復(fù) 2020-01-07
?
LEATH

TA貢獻1936條經(jīng)驗 獲得超7個贊

我認(rèn)為方法簽名仍然需要完全相同,因為在編譯時,如果HydroEngine是Engine,則無法解決。


interface WaterCar extends Car {

    function setEngine(Engine $engine);

}



查看完整回答
反對 回復(fù) 2020-01-07
  • 2 回答
  • 0 關(guān)注
  • 353 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號