2013-10-20 27 views
4

爲什麼下面這段代碼運行得如我所期望的那樣運行?我曾經有過這樣的印象:一個類只能有一個超類,並且在首次定義該類時會放置原始超類以外的東西會引發類型不匹配異常。什麼時候Ruby類可以有多個超類

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 

回答

5

它適用於我(Ruby 1.9.2和1.9.3),只有當第二類聲明從Object繼承。 MI中的任何其他嘗試都會引發TypeError

此外它不會改變類的繼承。所以MyTest.superclass仍然Test即使class MyTest < Object

我想這是因爲Object是定義一個新的類時,默認superclass。從docs

new(super_class=Object) → a_class 

所以當Object給出的superclass它的不匹配檢查,因爲如果Object是用戶輸入或默認值,它是不知道會被忽略。

+1

+1這。 OP正在運行實施細節。 –

3

從不。紅寶石確實而不是支持MI(但看到性狀作爲一個有用的替代品)。

無論如何,這個類的重新定義是不明確的,並且會根據特定的Ruby實現產生不同的效果。當我運行給定的代碼時,我得到「TypeError:類的超類不匹配..」(Ruby 1.9.2; 1.9.3錯誤出現延遲)。

如果有問題的代碼不會導致這樣的錯誤,檢查MyTest.superclass看什麼超真的說重新定義後:注意:#superclass返回類對象,而不是收藏。

這裏是反例認爲這種重新定義方案不添加或指示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工作)。

+0

雖然在一般情況下是正確的,但在OP的問題中有一點微妙之處。我懷疑@ tihorn的答案在這裏是正確的。 –

相關問題