我是 Ruby 新手,正在阅读这篇文章,将 mixin 与 C# 接口进行比较。我不清楚的是,mixin 中的方法是否可以在实现它的类中重新定义。
例如,如果我把include myMixin
- 它有一个方法toJSON
- 在一个 class中MyClass
,我可以重新定义toJSON
in MyClass
,还是我会坚持 in 中定义的行为myMixin
?
对于任何有兴趣的人,该博客文章是一个很好的信息来源吗?将 Ruby mixin 与 C# 接口进行比较是否合理?
类中定义的方法将始终覆盖通过 Ruby 中的模块混合到该类中的方法
例如:
module Bang
def bar
"lol"
end
end
class Foo
include Bang
def bar
42
end
end
Foo.new.bar
=> 42
无论何时包含模块,bar
都会首先调用类上定义的方法。这是因为 ruby 查找方法的方式——它在搜索包含在类中的任何模块之前搜索类本身。
http://anders.janmyr.com/2009/06/ruby-method-lookup.html
http://blog.rubybestpractices.com/posts/gregory/031-issue-2-method-lookup.html
不,您没有被卡住,您可以使用更多 mixin 模块覆盖该方法,或者在包含 mixin 后重新定义该方法。
您可以在新方法中决定让 mixin 通过调用来处理它super
,就像继承一样。
由于您来自 C# 背景,因此您应该意识到 Ruby 的一些方法永远不会“卡住”。您可以随时重新定义方法,甚至在 Object 或 Class 等核心语言类上。这是危险的,但有可能。您可以以编程方式更改语言、创建新类或执行其他元编程巫术。
include
使模块成为您将其混入的类的超类。显然,您可以在子类中覆盖超类的方法,这就是子类化的工作方式,不仅在 Ruby 中,而且在几乎任何其他基于类的 OO 语言中也是如此。