自分の練習問題として、サンプルプログラムをさまざまな言語に翻訳していました。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
または、動的言語で使用される別の好ましいイディオムはありますか?