我是Ruby的新手,正在阅读this post,将mixin与C#界面进行比较。我不清楚的是,mixin中的方法是否可以在实现它的类中重新定义。
例如,如果我将include myMixin
- 具有方法toJSON
- 放在课程MyClass
中,我可以在toJSON
中重新定义MyClass
,或者我是否坚持myMixin
中定义的行为?
对于任何有兴趣的人,该博客是否发布了良好的信息来源?将Ruby mixin与C#接口进行比较是否合理?
答案 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语言中也是如此。