2 回答
TA贡献1898条经验 获得超8个赞
它确实违反了SOLID规则。您声明Car::setEngine接受一个类型的参数Engine,但子级WaterCar::setEngine接受一个类型的参数HydroEngine。即使HydroEngine是的子类型Engine,它仍然是不同的类型。
当上课的时候Foo implements WaterCar,上课也是正确的instanceof Car。但是Foo::setEngine接受一个HydroEngine,但是不接受一个Engine。因此,Foo::setEngine据推测implements Car,但不接受type参数Engine。这打破了Liskov替代原则。您不能在子接口,周期中更改参数的类型。
继承的关键字是明确的extends。子类与父类完全相同,甚至可能更多。它不能做的比父项少。既然HydroEngine是一个专门亚型Engine,这将意味着一个WaterCar不小于比Car,因为它只接受的更窄的亚型Engine。例如:
function (Car $car) {
$engine = new EngineImplementation;
$car->setEngine($engine);
}
如果您传入,则上面的代码会崩溃WaterCar,因为它不接受Engine。
TA贡献1936条经验 获得超6个赞
我认为方法签名仍然需要完全相同,因为在编译时,如果HydroEngine是Engine,则无法解决。
interface WaterCar extends Car {
function setEngine(Engine $engine);
}
- 2 回答
- 0 关注
- 336 浏览
添加回答
举报