从Java到Ruby:用以下方式替换继承?

时间:2014-08-12 18:21:28

标签: ruby inheritance overloading

我正在为Ruby中的绣花机文件格式编写一个阅读器,它有两种类型的针脚:

  • 常规针迹:有颜色和相对坐标。
  • 跳缝:还有颜色和相对坐标,但它们不可见(最终刺绣中的线将被手动移除,并且在任何可能生成的预览中都不可见)并且坐标更改通常远大于定期缝合

在Java中,我可能会使用抽象基类" Stitch"和两个班级" JumpStitch"和#34; RegularStitch"继承它。然后我会使用快速和脏的instanceof或重载方法(句柄(JumpStitch针脚),手柄(RegularStitch针脚)或类似的东西)来做那些事情(我需要区分常规针脚和跳针)。

你如何在Ruby中实现类似的东西(因为Ruby缺少方法重载和instance_of?根据https://stackoverflow.com/a/3893403/3818564是一个很大的nono?)

以下评论中包含两个用例:

我有一个List中所有连续针迹的列表 - 其中一些是RegularStitch类型,其他类型是JumpStitch。现在我想对这个列表做些什么。 说,画一个预览。我正在迭代列表,并根据针脚的类型决定做什么:使用给定的颜色绘制RegularStitch,不绘制JumpStitch(但是坐标将从它更新,因为它们是它的基础以下针脚)。 - 22分钟之前的no-trick-pony

另一个例子:我想实际操作刺绣机。当只有常规针迹(相同颜色)时,我可以更快地操作机器,但如果接下来是JumpStitch,则必须减慢机器速度。我希望这能澄清我的意图。

1 个答案:

答案 0 :(得分:3)

我认为你的handle(JumpStich)handle(RegularStitch)首先是对OO设计的不良用法。如果不包含行为,有什么不同的类型?

为什么这不起作用?

class Stitch

  attr_accessor :color, :coordinates

  # ... common behavior

end

class RegularStitch < Stitch

  def foo
    # regular stitch behavior
  end

end

class JumpStitch < Stitch # or RegularStitch?

  def foo
    # jump stitch behavior
  end

end

您的Reader类会根据读取的数据创建实例。我们对foo的含义知之甚少,所以我只能猜测,但这是多态性的全部要点之一。