2013-04-26 67 views
0

我想了解以下在Ruby中擴展類的最佳實踐是什麼?

module XYZ 
    class A 
    end 
    class B 
    end 
end 

不C類同時繼承類A和B之間的差異,或者我必須使用<延長呢?

module YZZ 
include XYZ 
    class C < A 
    end 
end 

當我做下列事情時會發生什麼?它現在包括所有課程,還是僅包含A課程?

module YZZ 
extend XYZ 
    class C < A 
    end 
end 
  • 什麼是從擴展C類的最佳方式?
  • 如何使用A和B來擴展C類?
  • 我怎樣才能只包括類A?
+1

你在第二個和第三個代碼塊中有什麼是無效的Ruby。 – 2013-04-26 12:05:22

+0

什麼是無效的? – amjad 2013-04-26 12:24:08

+1

您缺少模塊名稱。像'module Hello;延長XYZ結束「。 – 2013-04-26 12:32:13

回答

0

廣告1,是的,C繼承了A和B,當你使用#include。 #extend適用於類方法。

廣告2. class C < A,想一想,A只是一個常數,它被賦值爲實例Class的對象 。所以,當然,C成爲它的子類。

Ad 3.當您在'module'語句中使用#extend時,self是模塊本身,而XYZ 基本上包含在它的sigleton類中。

至於你最後三個問題,我不明白第一個問題。什麼是「從A級擴展C級」?請問class C < XYZ::A嗎?至於第二個問題,您可以簡單地通過C.extend(XYZ)擴展C「使用A和B」。至於「你怎麼才能包括類A」,沒有簡單的方法只包含模塊的一部分。如果您計劃單獨包括A類,如果即使沒有B也有其自己的問題需要解決,請將其放入單獨的模塊中幷包含該模塊。這就是所謂的分離問題。如果你只是想摘櫻桃,你可以這樣做:

module Something 
    A = XYZ::A 
end 

有你有一個恆定的東西::一個指向相同的類XYZ ::一個。

+0

感謝鮑里斯。通過「從A擴展C類的最佳方式是什麼?」我的意思是;我可以做C amjad 2013-04-26 11:41:55

+0

Amjad,'A'和'XYZ :: A'之間的選擇與'extend'無關。這僅僅是一個在Ruby中訪問常量的問題。防火方式是寫':: XYZ :: A'(有點像'\ xyz \ a')。只要您調用的名稱空間沒有定義另一個常量'XYZ','XYZ :: A'就會工作。只有當你在詞彙上處於相同的命名空間時,「A」才起作用,就像定義了A的命名空間一樣。查找有關訪問Ruby常量的更多學習材料,沒有足夠的空間在此處進行闡述。 – 2013-04-26 12:31:04

0

這應該工作:

module XYZ 
    class A 
    end 
    class B < A 
    end 
end 

那麼對於包括XYZ模塊,並從A延伸C:

module ABC 
include XYZ 
    class C < A 
    end 
end 
相關問題