作为我自己的练习,我正在将一个示例程序翻译成各种语言。从 C# 开始,我有一个访问者模式界面,如下所示:
interface Visitor
{
void Accept(Bedroom x);
void Accept(Bathroom x);
void Accept(Kitchen x);
void Accept(LivingRoom x);
}
转向 ruby(或 python,或其他),我不再根据类型从编译器获得调度。我应该在访客本身中进行调度吗?
class Cleaner
def accept(x)
acceptBedroom(x) if Bedroom === x
acceptBathroom(x) if Bathroom === x
acceptKitchen(x) if Kitchen===x
acceptLivingRoom(x) if LivingRoom===x
end
...
或者我应该在房间的不同专业中进行调度:
class Bathroom<Room
def initialize(name)
super(name)
end
def accept(visitor)
visitor.acceptBathroom(self)
end
end
或者是否有另一个在动态语言中使用的首选习语?