模塊幫助定義Ruby多繼承
雖然Ruby作為一種新語言,具有一些不同于其他語言的特性,比如沒有函數(shù),只有方法。但是它還是脫不了編程語言特有的性質(zhì)。在這里我們將會為大家介紹有關(guān)Ruby多繼承的相關(guān)實現(xiàn)方法。#t#
一些程序語言(如C++和CLOS)提供了多重繼承機(jī)制:一個類可以繼承自多個超類。例如,一個House可能繼承自一個Building類(連同Office和Hospital類一起)和Residence類(連同Apartment類一起)。盡管多重繼承可能成為一種語言強(qiáng)有力的特征,但是由于它會增加該語言的復(fù)雜性和歧義,因此許多面向?qū)ο笳Z言都沒有加入它。
Ruby支持單繼承。然而,它還提供了mixin-它提供了Ruby多繼承的許多特征。一個mixin是一種"模塊"類型。為此,你必須首先理解在Ruby中模塊的含義。
在Ruby中,模塊是一種把方法和常數(shù)分組的方式。它與類相似,但是一個模塊沒有實例并且也沒有子類。也許解釋模塊的***方法是舉一個例子。假定你正在開發(fā)一個制造業(yè)應(yīng)用程序。該程序需要存取大量的科學(xué)公式和常數(shù),那么你可以或者是創(chuàng)建一個通用類來把這些放在其中或者是創(chuàng)建一個模塊。模塊的優(yōu)點(diǎn)在于,在存取其中的公式時,根本沒有任何實例擾亂所帶來的煩惱。
- moduleFormulas
- ACCELERATION=9.8
- LIGHTSPEED=299792458
- defenergy(mass)
- mass*(LIGHTSPEED**2)
- end
- defforce(mass)
- mass*ACCELERATION
- end
- end
現(xiàn)在,這些公式方法和常數(shù)可以被任何數(shù)目的其它類或其自身所使用:
- irb(main):046:0>
Formulas.force(10)- =>98.0
- irb(main):047:0≫
Formulas::ACCELERATION- =≫9.8
注意,為了調(diào)用一個模塊方法或使用一個模塊常數(shù),你必須使用類似于調(diào)用一個類方法的標(biāo)志。為了調(diào)用一個模塊方法,你需要使用模塊類名,后面跟著一個點(diǎn),再跟著模塊方法名。為了引用模塊常數(shù),你可以使用模塊名,后面跟著兩個冒號,再跟著常數(shù)名。
除了作為方法和常數(shù)的"公共"應(yīng)用以外,模塊還可以幫助定義Ruby多繼承。一個mixin是一個簡單的"包括"有一個類定義的模塊。當(dāng)一個類包括一個模塊時,所有的模塊中的方法和常數(shù)都成為類的實例方法和常數(shù)。例如,假定上面定義的Formula模塊作為一個mixin被添加到Rectangle類。為此,你要使用"include"關(guān)鍵字:
- classRectangle
- includeFormulas
- end
現(xiàn)在,Rectangle的實例具有了它們可以使用的force和energy方法,并且Rectangle類能夠訪問常數(shù)ACCELERATION和LIGHTSPEED:
- irb(main):044:0>
classRectangle- irb(main):045:1>
includeFormulas- irb(main):046:1>end
- =>Rectangle
- irb(main):047:0>
Rectangle.new(4,5).force(10)- =>98.0
- irb(main):048:0>
Rectangle::LIGHTSPEED- =>299792458
這意味著,mixin給Ruby中的類帶來了許多多重繼承的優(yōu)點(diǎn),卻避開了多重繼承中存在的問題。
Ruby多繼承控制流
象所有的程序語言一樣,Ruby提供了一組控制流命令,這包括條件語句(if/else結(jié)構(gòu)),case語句和循環(huán)語句(do,while和for),還提供了象Ada和Java等語言中的異常處理能力。下面是Ruby中的一些控制流語句的示例:
- ifarea>100
- "big"
- else
- "small"
- end
- caseheight
- |when1
- |print"stubbyn"
- |when2..10#高度范圍為2~10
- |print"shortn"
- |when10..20#高度范圍為2~10
- |print"talln"
- |end
- aRect=Rectangle.new(4,6)
- whileaRect.area
<100andaRect.height<10- aRect.doubleSize()
- end
- forelementin[2,9.8,"
somestring",Math::PI]
#遍歷對象集合- print"Thetypeis:"+
element.type.to_s+"n&"- end
控制語句通常非常直接,但是如前面的case語句和for循環(huán)語句所顯示的,Ruby借鑒了其它一些語言特征和普通的面向?qū)ο蟮奶匦浴?/p>
異常處理類似于Java中的"try...catch...finally"語句。在Ruby中,它們更改為"begin...rescue...ensure"語句:
- begin
- #實現(xiàn)一些事情
- rescue
- ##處理錯誤
- ensure
- #做一些清理工作,
如關(guān)閉一個打開的文件等- end
為了在你的Ruby多繼承代碼中引發(fā)一個異常,你只需要簡單地調(diào)用raise方法:
- ifarea<0
- raise
- elseifarea>0andarea<10
- raise"Rectangletoosmall"
- elseifarea>100
- raiseTooBigException
"Rectangletoobig"- end
***個raise調(diào)用創(chuàng)建一個RuntimeError。第二個raise創(chuàng)建一個顯示一條消息的RuntimeError。***一個raise調(diào)用一個TooBigException的新實例(由它創(chuàng)建一個粗略定義的錯誤),并設(shè)置它的適當(dāng)消息。
一個Ruby多繼承小程序
為了幫助你更好地掌握Ruby的基礎(chǔ)知識,我在本文中提供了一個小程序供你學(xué)習(xí)之用。為了使這個程序工作,你可以下載并把該文件解壓到你的文件系統(tǒng)。之后,它將創(chuàng)建一個examples文件夾,在這個目錄下共有9個Ruby代碼文件(.rb文件)。本文中的代碼就包含在這些文件中。另外,你會找到一個testShapes.rb文件,它是測試Ruby的Rectangle,Square和Circle對象的主文件。只需簡單地打開一個命令提示符并運(yùn)行testShapes.rb文件即可。
你將注意到,在testShapes.rb和另外一些代碼中,文件以"require"再加上一個文件名開頭(象rectangle.rb)。這是在你的Ruby程序中加入或使用來自于其它文件代碼的Ruby標(biāo)志。