它 确实
违反了SOLID规则。您声明
Car::setEngine接受一个类型的参数
Engine,但子级
WaterCar::setEngine接受一个类型的参数
HydroEngine。即使
HydroEngine是的子类型
Engine,它仍然是不同的类型。
当上课的时候
Foo implements WaterCar,上课也是正确的
instanceofCar。但是
Foo::setEngine接受一个
HydroEngine,但是不接受一个
Engine。因此,
Foo::setEngine据推测
implementsCar,但不接受type参数
Engine。这打破了Liskov替代原则。您不能在子接口,周期中更改参数的类型。
继承的关键字是明确的 extends
。子类与父类 完全相同 ,甚至可能 更多 。它不能做的比父项 少
。既然
HydroEngine是一个专门亚型
Engine,这将意味着一个
WaterCar不 小于
比
Car,因为它只接受的更窄的亚型
Engine。例如:
function (Car $car) { $engine = new EngineImplementation; $car->setEngine($engine);}如果您传入,则上面的代码会崩溃
WaterCar,因为它不接受
Engine。



