你可以在实现它的类中重新定义mixin的方法吗?

时间:2013-01-11 00:29:56

标签: ruby interface mixins

我是Ruby的新手,正在阅读this post,将mixin与C#界面进行比较。我不清楚的是,mixin中的方法是否可以在实现它的类中重新定义。

例如,如果我将include myMixin - 具有方法toJSON - 放在课程MyClass中,我可以在toJSON中重新定义MyClass,或者我是否坚持myMixin中定义的行为?

对于任何有兴趣的人,该博客是否发布了良好的信息来源?将Ruby mixin与C#接口进行比较是否合理?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

你应该意识到Ruby,因为你来自C#背景,因为ruby的方法永远不会被“卡住”。您可以随时重新定义方法,甚至可以在Object或Class等核心语言类上重新定义。这很危险,但可能。您可以通过编程方式更改语言,创建新类或执行其他元编程伏都教。

答案 2 :(得分:-1)

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