我正在设计一个可以根据状态改变其行为的对象。如果其属性包含可以是各种类型的对象,则为一种类型。下面是一个例子:
class Person {
// many types of glasses available
protected $glasses;
public function putOnBoots ()
{
// does this type check smell?
if ($this->glasses instanceof SunGlasses) {
trigger_error('never wear boots with sunglasses');
return false;
}
// [...] put on boots
return true;
}
public function lookAtStuff ($stuff)
{
// glasses provides polymorphic behavior here
return $this->glasses->filter($stuff);
}
}应该注意的是,$glasses确实在类的其他地方提供了自己的多态行为,因此类型具有更大的用途。但是有一些行为(比如putOnBoots())觉得它们不应该属于$glasses,即使它们在表示Person状态的方式上可能会受到它的类型的影响。
在我看来,以这种方式检查对象类型是不对的。我是闻到了异味,还是我只是在想象?
发布于 2012-02-10 13:18:54
在我看来确实有点难闻。一个更好的选择是使用眼镜的一些多态行为。也许是像这样的虚拟方法..。
bool goesWithBoots()这在大多数情况下返回TRUE,但对于太阳镜则返回FALSE。
这样做的好处是,您可以通过添加其他类型的眼镜来扩展代码,并且它们可以自己决定是否“搭配眼镜”-而且您不必担心每次添加其他类型的眼镜时是否需要修改putOnBoots()方法。
https://stackoverflow.com/questions/9223018
复制相似问题