作为行使对于自己,我的翻译样本的程序进各种语言。开始在C#我有一个访客的图形接口,像这样:

interface Visitor
    {
        void Accept(Bedroom x);
        void Accept(Bathroom x);
        void Accept(Kitchen x);
        void Accept(LivingRoom x);
    }

移动到红宝石(或蟒蛇,或无论),我不再分派从编译器基础上的类型。我应该做的派遣的访问本身?

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

  ...

或者我应该做的调度在不同specializaions的房:

class Bathroom<Room
  def initialize(name)
    super(name)
  end
  def accept(visitor)
    visitor.acceptBathroom(self)
  end
end

或是有另一种优选的成语,用于在动态的语言?

有帮助吗?

解决方案

我的建议是使用前一种方式。有的长处和短处,为每一个方法。前者是难以维持的数量的房间类型的增长;后者是很难如数吸尘器类型的增长。

Ruby,你可以试试

def accept(x)
  send "accept#{x.class}".to_sym, x
end

PS:不是所有类型的动态语言是无法做到的调度基础上的类型;一些可以推断出类型,或者如果做不到这一点,可以使用强迫铸选择适当的方法之中载的选择。

其他提示

我会去的第二个版本。第一个看起来像的样的代码的气味,访问是应该解决:长如果其他-如果或关情况下的发言。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top