检查抽象类内部的接口实现是否是反模式?

g4b*_*4b0 3 php oop

以下代码是否违反某些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)

ter*_*ško 5

如果您指的是SOLID,则它违反了打开/关闭原则。如果需要添加新的子类,则必须更改超类,并实际上间接导致所有其他子类发生更改。

实例正在测试其类型似乎也很奇怪。这与“工厂方法”在同一雷区中穿越,可以说构成了单一责任原则的违反。

而且,由于您有一个超类,所以通常这只是一个不好的代码,它会写入输出缓冲区(使用echo)。