0

我是 Ruby 新手,正在阅读这篇文章,将 mixin 与 C# 接口进行比较。我不清楚的是,mixin 中的方法是否可以在实现它的类中重新定义。

例如,如果我把include myMixin- 它有一个方法toJSON- 在一个 class中MyClass,我可以重新定义toJSONin MyClass,还是我会坚持 in 中定义的行为myMixin

对于任何有兴趣的人,该博客文章是一个很好的信息来源吗?将 Ruby mixin 与 C# 接口进行比较是否合理?

4

3 回答 3

2

类中定义的方法将始终覆盖通过 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

于 2013-01-11T00:44:25.347 回答
1

不,您没有被卡住,您可以使用更多 mixin 模块覆盖该方法,或者在包含 mixin 后重新定义该方法。

您可以在新方法中决定让 mixin 通过调用来处理它super,就像继承一样。

由于您来自 C# 背景,因此您应该意识到 Ruby 的一些方法永远不会“卡住”。您可以随时重新定义方法,甚至在 Object 或 Class 等核心语言类上。这是危险的,但有可能。您可以以编程方式更改语言、创建新类或执行其他元编程巫术。

于 2013-01-11T00:34:03.457 回答
-1

include使模块成为您将其混入的类的超类。显然,您可以在子类中覆盖超类的方法,这就是子类化的工作方式,不仅在 Ruby 中,而且在几乎任何其他基于类的 OO 语言中也是如此。

于 2013-01-11T01:01:15.137 回答