有一段代码:
module Module1
def initialize
puts "init module1..."
end
def do_1
puts "do 1"
end
end
module Module2
def initialize
puts "init module2..."
end
def do_2
puts "do 2"
end
endclass Test
def initialize
puts "init Test..."
end
end
class NewTest < Test
include Module1
include Module2
def initialize
super
end
def do
do_1
do_2
end
endt = NewTest.new
t.do
ruby里实例方法调用链是这样的:
本身的方法 -> mix-in方法 -> 父类方法
同时父类方法查找链也是遵循上面的顺序,直到祖先。。
super只能向上移一个位置
还有为啥调用了module2的方法,而没有调用mdule1的方法是因为相同级别的同名方法后面定义的会覆盖前面的。
而你想用super直接跳到父类。。这个貌似ruby语法还不支持。。
这里有一个帖子是讨论super super的:
[url]http://www.pubbs.net/200905/ruby/107849-super-super-.html[/url]
看这里的代码: http://github.com/rails/rails/blob/master/activemodel/lib/active_model/validator.rb
基本上所有的代码都是 module ActiveModel 开始写的,为什么全部都是 module ActiveModel 呢,而且这些 module 里面从来不写 initialize ...
我觉得代码还是写简单点好,简单高效.
mixin是个超典型的老瓶装新酒,其实说白了就是C++多继承的变种而已。
C++里,如果一个子类有多个父类时,则按照声明的顺序一次执行父类的构造函数,如class Derived : public Base1,public Base2 你先声明Base1,后Base2,所以先调用Base1后Base2的构造函数,而与 Base2(z),Base1(y)的顺序无关。
C++的构造函数是异名的,但ruby被限制成initialize,所以结果就如hoopo所说的,缺胳膊少腿了。。。。(应该算是个bug)