Ruby的模塊非常類似類,除了:
模塊不可以有實(shí)體?
模塊不可以有子類?
模塊由module...end定義.
實(shí)際上...模塊的'模塊類'是'類的類'這個(gè)類的父類.搞懂了嗎?不懂?讓我們繼續(xù)看下去吧.
模塊有兩種用法.其一是將相近的方法和實(shí)體放在一個(gè)相對(duì)集中的域里.Ruby標(biāo)準(zhǔn)包里的Math模塊就扮演著這一角色:
ruby>?Math.sqrt(2)
???1.41421
ruby>?Math::PI
???3.14159?
::操作符告訴?Ruby?解釋器在哪里找常數(shù)的值(可以想像,Math外的其它模塊用PI表示其它的一些東西).如果我們想省掉?::?直接調(diào)用一個(gè)模塊的方法和常數(shù),我們可以用?include:
ruby>?include?Math
???Object
ruby>?sqrt(2)
???1.41421
ruby>?PI
???3.14159?
模塊的另一用法是糅和(mixin).某些OO語言,包括C++,允許多重繼承(multiple?inheritance),即從多個(gè)的父類里繼承.?現(xiàn)實(shí)世界里一個(gè)多重繼承的例子是鬧鐘:你可以想像鬧鐘屬于鐘類同是屬于帶蜂音器的事物類.
Ruby并未特意實(shí)現(xiàn)真正的多重繼承,但糅和技術(shù)是一很好的替代.記得模塊無法實(shí)體化或子類化;但如果我們?cè)陬惗x里include一個(gè)方法,
它的方法便實(shí)際上已加入,或"糅合"進(jìn)這個(gè)類.
糅合可以視為一種尋求一切我們希望得到的特定屬性的方法.舉個(gè)例子,如果一個(gè)類有個(gè)?each?方法,把標(biāo)準(zhǔn)庫(kù)里的Enumerable模塊糅合進(jìn)來就自然地賦予我們?sort?和?find?兩個(gè)方法.
模塊的使用令到我們獲得多重繼承的基本功能卻可通過簡(jiǎn)單的樹結(jié)構(gòu)表述類關(guān)系,同時(shí)也可觀地簡(jiǎn)化了語言的實(shí)現(xiàn)(Java的設(shè)計(jì)者也做了一個(gè)類似的選擇).
版權(quán)聲明:RUBY文檔中心的所有文章標(biāo)明[原創(chuàng)]的均為本站作品,版權(quán)屬RUBY中文化計(jì)劃,若轉(zhuǎn)載請(qǐng)注明;標(biāo)明[翻譯]的其外文版權(quán)歸原作者,譯文版權(quán)屬RUBY中文化計(jì)劃;標(biāo)明[轉(zhuǎn)貼]的,若原作者感到侵犯了他的著作權(quán),那么請(qǐng)及時(shí)跟主持人聯(lián)系,我們會(huì)盡快更正。
?