2017-10-18 64 views
2

以下代码是否违反了一些OOP原则/模式?检查抽象类内的接口实现是否为反模式?

尤其是我感兴趣的的instanceof检查车内:: whatCanDo()方法,如果一个子类implents一个特定的接口入住手续。

乍一看,它似乎违反了利斯科夫的原则,但实际上并没有这样做,因为飞机和汽车类别仍然可以互换。

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 { 
} 

回答

3

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

一个实例正在测试它是什么类型,这似乎也很奇怪。这与“工厂方法”相同,可能构成违反单一责任原则。

它只是一个不好的代码,因为你有一个超类,写入输出缓冲区(使用echo)。

+1

我们可以假设回声只是例如,我想 –

+1

@RobbieAverill很难说。我看到太多人在他们的“班级”代码中有回声。基本上每个第三个PDO包装(这实际上需要一个单独的咆哮)在StackOverflow做到这一点。 –

+0

@tereško回声它只是例如,类名也是样本,我的真实代码是不同的。 – g4b0