以下代码是否违反某些OOP原则/模式?
我尤其对Vehicle :: whatCanDo()方法中的instanceof检查感兴趣,该检查检查子类是否构成特定接口。
乍一看,它似乎违反了Liskov原则,但实际上并没有违反,因为Airplane和Car类仍然可以互换。
abstract class Vehicle {
public function whatCanDo() {
if ($this instanceof CanFly) {
echo "can fly";
}
}
}
interface CanFly {
}
class Airplane extends Vehicle implements CanFly {
}
class Car extends Vehicle {
}
Run Code Online (Sandbox Code Playgroud)
如果您指的是SOLID,则它违反了打开/关闭原则。如果需要添加新的子类,则必须更改超类,并实际上间接导致所有其他子类发生更改。
实例正在测试其类型似乎也很奇怪。这与“工厂方法”在同一雷区中穿越,可以说构成了单一责任原则的违反。
而且,由于您有一个超类,所以通常这只是一个不好的代码,它会写入输出缓冲区(使用echo)。