以下代码是否违反了某些OOP原则/模式?
特别是我对 Vehicle :: whatCanDo()方法中的 instanceof 检查感兴趣,检查子类是否实现了特定的接口。
乍一看,它似乎违反了利斯科夫的原则,但实际上并没有,因为飞机和汽车类仍然是可以互换的。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 {
}
答案 0 :(得分:3)
如果您指的是SOLID,那么它违反了开放/封闭原则。如果需要添加新的子类,则必须更改超类并实际间接导致所有其他子类发生更改。
实例测试它的类型似乎也很奇怪。这与“工厂方法”#34;并且可以被认为是违反单一责任原则的行为。
一般来说它只是一个糟糕的代码,因为你有一个超类,它写入输出缓冲区(使用echo
)。