重写模块的方法是一个很好的约定吗?

时间:2015-07-08 12:50:27

标签: ruby design-patterns

我有一些template patterned模块,定义的方法很少(默认行为),有些看起来像下面的方法:

def tax
  1.2
end

def do_something!
  raise "Please implement it in your class"
end

我已经读过,在大多数情况下,由于继承功能(单继承)以及我根本不需要super(),我应该使用模块而不是继承。

但我觉得有点内疚来覆盖所有raise "..."方法和一些默认方法(如tax方法),因为它是模块。

您怎么看?

当我需要覆盖方法时,我应该使用继承还是包含模块?

1 个答案:

答案 0 :(得分:3)

我通常遵循的规则是:当必须在包括模块的类中定义方法时(例如模块充当接口)我总是这样做:

def method_that_needs_to_be_defined
  raise NoMethodError
end

这是一种很好的做法,可以防止意外调用尚未定义的方法。

示例:

module Speaker
  def speak
    raise NoMethodError
  end
end

class Bird < Animal
  include Speaker

  def speak
    'chirp'
  end
end