为什么下面的代码会像我希望的那样运行?我的印象是,一个类只能有一个超类,并且在第一次定义类时放置除了原始超类之外的东西会引发类型不匹配异常。
class Test
end
class MyTest < Test
def run
p 'my test'
end
end
class MyTest < Object
def run
p 'redefine my test'
end
end
MyTest.new.run
结果
redefine my test
答案 0 :(得分:5)
只有当第二个类声明继承自Object
时,它才适用于我(Ruby 1.9.2和1.9.3)。 MI的任何其他尝试都会引发TypeError
。
它也不会改变类的继承。因此MyTest.superclass
即使在Test
class MyTest < Object
我认为这是因为Object
是定义新类时的默认superclass
。来自docs:
new(super_class=Object) → a_class
因此,当Object
作为superclass
时,它会在不匹配检查中被忽略,因为不知道Object
是用户输入还是默认值。
答案 1 :(得分:3)
从不。 Ruby 不支持MI(但将traits视为有用的替代方案)。
无论如何,这个类重定义是不明确的,并且会根据特定的Ruby实现产生不同的效果。当我运行给定的代码时,我得到&#34; TypeError:类的超类不匹配。&#34; (Ruby 1.9.2; 1.9.3错误出现延迟)。
如果相关代码没有导致此类错误,请检查MyTest.superclass
以查看重新定义后超类真正的内容:请注意#superclass
返回< em>单个类对象,而不是集合。
以下是反例,认为此重新定义方案不添加或指示MI:
class A
def a; "a"; end
end
class B
def b; "b"; end
end
class C < A
end
# This may raise said TypeError, but if it does not then ..
class C < B
end
# .. either this will work
C.new.a
# .. /or possibly/ this will work
C.new.b
# If the redefinition added MI then /both/ would work.
# If such an implementation is found, please let me know!
(我无法在不引发TypeError的情况下完成上述工作。)