什么时候Ruby类可以有多个超类

时间:2013-10-20 05:19:30

标签: ruby class inheritance

为什么下面的代码会像我希望的那样运行?我的印象是,一个类只能有一个超类,并且在第一次定义类时放置除了原始超类之外的东西会引发类型不匹配异常。

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

2 个答案:

答案 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的情况下完成上述工作。)