我有一些template patterned
模块,定义的方法很少(默认行为),有些看起来像下面的方法:
def tax
1.2
end
def do_something!
raise "Please implement it in your class"
end
我已经读过,在大多数情况下,由于继承功能(单继承)以及我根本不需要super()
,我应该使用模块而不是继承。
但我觉得有点内疚来覆盖所有raise "..."
方法和一些默认方法(如tax
方法),因为它是模块。
您怎么看?
当我需要覆盖方法时,我应该使用继承还是包含模块?
答案 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