Ruby程序設(shè)計(jì)語(yǔ)言快速入門(六)------之多繼承

          ?一些程序語(yǔ)言(如C++和CLOS)提供了多重繼承機(jī)制:一個(gè)類可以繼承自多個(gè)超類。例如,一個(gè)House可能繼承自一個(gè)Building類(連同Office和Hospital類一起)和Residence類(連同Apartment類一起)。盡管多重繼承可能成為一種語(yǔ)言強(qiáng)有力的特征,但是由于它會(huì)增加該語(yǔ)言的復(fù)雜性和歧義,因此許多面向?qū)ο笳Z(yǔ)言都沒(méi)有加入它。

            Ruby支持單繼承。然而,它還提供了mixin-它提供了多繼承的許多特征。一個(gè)mixin是一種"模塊"類型。為此,你必須首先理解在Ruby中模塊的含義。

            在Ruby中,模塊是一種把方法和常數(shù)分組的方式。它與類相似,但是一個(gè)模塊沒(méi)有實(shí)例并且也沒(méi)有子類。也許解釋模塊的最好方法是舉一個(gè)例子。假定你正在開(kāi)發(fā)一個(gè)制造業(yè)應(yīng)用程序。該程序需要存取大量的科學(xué)公式和常數(shù),那么你可以或者是創(chuàng)建一個(gè)通用類來(lái)把這些放在其中或者是創(chuàng)建一個(gè)模塊。模塊的優(yōu)點(diǎn)在于,在存取其中的公式時(shí),根本沒(méi)有任何實(shí)例擾亂所帶來(lái)的煩惱。

          module?Formulas
          ACCELERATION?=?9.8
          LIGHTSPEED?=?299792458
          def?energy?(mass)
          mass*(LIGHTSPEED**2)
          end
          def?force?(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)用一個(gè)模塊方法或使用一個(gè)模塊常數(shù),你必須使用類似于調(diào)用一個(gè)類方法的標(biāo)志。為了調(diào)用一個(gè)模塊方法,你需要使用模塊類名,后面跟著一個(gè)點(diǎn),再跟著模塊方法名。為了引用模塊常數(shù),你可以使用模塊名,后面跟著兩個(gè)冒號(hào),再跟著常數(shù)名。

            除了作為方法和常數(shù)的"公共"應(yīng)用以外,模塊還可以幫助定義多重繼承。一個(gè)mixin是一個(gè)簡(jiǎn)單的"包括"有一個(gè)類定義的模塊。當(dāng)一個(gè)類包括一個(gè)模塊時(shí),所有的模塊中的方法和常數(shù)都成為類的實(shí)例方法和常數(shù)。例如,假定上面定義的Formula模塊作為一個(gè)mixin被添加到Rectangle類。為此,你要使用"include"關(guān)鍵字:

          class?Rectangle
          include?Formulas
          end
          ?

            現(xiàn)在,Rectangle的實(shí)例具有了它們可以使用的force和energy方法,并且Rectangle類能夠訪問(wèn)常數(shù)ACCELERATION和LIGHTSPEED:

          irb(main):044:0>?class?Rectangle
          irb(main):045:1>?include?Formulas
          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中的類帶來(lái)了許多多重繼承的優(yōu)點(diǎn),卻避開(kāi)了多重繼承中存在的問(wèn)題。

            十一、 控制流

            象所有的程序語(yǔ)言一樣,Ruby提供了一組控制流命令,這包括條件語(yǔ)句(if/else結(jié)構(gòu)),case語(yǔ)句和循環(huán)語(yǔ)句(do,while和for),還提供了象Ada和Java等語(yǔ)言中的異常處理能力。下面是Ruby中的一些控制流語(yǔ)句的示例:

          ifarea?>?100
          "big"
          else
          "small"
          end
          case?height
          |?when?1
          |?print?"stubby\n"
          |?when?2..10?#高度范圍為2~10
          |?print?"short\n"
          |?when?10..20?#高度范圍為2~10
          |?print?"tall\n"
          |?end
          aRect?=?Rectangle.new(4,6)
          while?aRect.area?<?100?and?aRect.height?<?10
          aRect.doubleSize()
          end
          for?element?in?[2,?9.8,?"some?string",?Math::PI]?#遍歷對(duì)象集合
          print?"The?type?is:?"?+?element.type.to_s?+?"\n&"
          end?


            控制語(yǔ)句通常非常直接,但是如前面的case語(yǔ)句和for循環(huán)語(yǔ)句所顯示的,Ruby借鑒了其它一些語(yǔ)言特征和普通的面向?qū)ο蟮奶匦浴?br />異常處理類似于Java中的"try...catch...finally"語(yǔ)句。在Ruby中,它們更改為"begin...rescue...ensure"語(yǔ)句:

          begin
          #實(shí)現(xiàn)一些事情
          rescue
          ##處理錯(cuò)誤
          ensure
          #做一些清理工作,如關(guān)閉一個(gè)打開(kāi)的文件等
          end?

            為了在你的代碼中引發(fā)一個(gè)異常,你只需要簡(jiǎn)單地調(diào)用raise方法:

          if?area?<?0
          raise
          else?if?area?>?0?and?area?<?10
          raise?"Rectangle?too?small"
          else?if?area?>?100
          raise?TooBigException?"Rectangle?too?big"
          end?

            第一個(gè)raise調(diào)用創(chuàng)建一個(gè)RuntimeError。第二個(gè)raise創(chuàng)建一個(gè)顯示一條消息的RuntimeError。最后一個(gè)raise調(diào)用一個(gè)TooBigException的新實(shí)例(由它創(chuàng)建一個(gè)粗略定義的錯(cuò)誤),并設(shè)置它的適當(dāng)消息。

            一個(gè)Ruby小程序

            為了幫助你更好地掌握Ruby的基礎(chǔ)知識(shí),我在本文中提供了一個(gè)小程序供你學(xué)習(xí)之用。為了使這個(gè)程序工作,你可以下載并把該文件解壓到你的文件系統(tǒng)。之后,它將創(chuàng)建一個(gè)examples文件夾,在這個(gè)目錄下共有9個(gè)Ruby代碼文件(.rb文件)。本文中的代碼就包含在這些文件中。另外,你會(huì)找到一個(gè)testShapes.rb文件,它是測(cè)試Ruby的Rectangle,Square和Circle對(duì)象的主文件。只需簡(jiǎn)單地打開(kāi)一個(gè)命令提示符并運(yùn)行testShapes.rb文件即可。

            你將注意到,在testShapes.rb和另外一些代碼中,文件以"require"再加上一個(gè)文件名開(kāi)頭(象rectangle.rb)。這是在你的Ruby程序中加入或使用來(lái)自于其它文件代碼的Ruby標(biāo)志。

            總結(jié)

            Ruby能否接管Java或C#而成為業(yè)界領(lǐng)先的現(xiàn)代軟件開(kāi)發(fā)語(yǔ)言?盡管Ruby可能變得十分流行,但我對(duì)此仍抱有懷疑態(tài)度。作為一名在業(yè)界摸爬滾打多年的專業(yè)人員,我對(duì)其偶然性并不感到驚訝,但我還是比較注重實(shí)效的。例如,我發(fā)現(xiàn)Smalltalk是一種比Java優(yōu)越的高級(jí)語(yǔ)言,然而優(yōu)越并不會(huì)總會(huì)贏。現(xiàn)代語(yǔ)言背后總存在大量的技術(shù)和市場(chǎng)方面的支持。庫(kù),開(kāi)發(fā)工具包,框架,架構(gòu),連接器,適配器,支持平臺(tái),服務(wù),知識(shí)庫(kù),能干的開(kāi)發(fā)團(tuán)隊(duì),等等,都會(huì)被配置到位以支持象Java這樣的程序語(yǔ)言。并且,無(wú)論你喜歡與否,Sun和Microsoft主宰下的市場(chǎng)在未來(lái)一段時(shí)間內(nèi)肯定還是開(kāi)發(fā)環(huán)境的勝者。

            那么,為什么還要探討Ruby呢?作為一種Perl或Python腳本語(yǔ)言的代替(這正是它的最初目的)或快速原型開(kāi)發(fā)工具,Ruby可能特別有用。一些人也已經(jīng)看到了Ruby的威力,并且開(kāi)始把Ruby作為一種偉大的方法進(jìn)行編程教學(xué)。根據(jù)我的本地Ruby用戶組的成員提供的信息,有一些人正在把它應(yīng)用于測(cè)試生產(chǎn)系統(tǒng)。不僅如此,我將邀請(qǐng)你,就象Bruce Tate和Dave Thomas邀請(qǐng)我一樣來(lái)探討一下這種語(yǔ)言的力量和美麗之處。即使Ruby不會(huì)得到廣泛使用,但是隨著人們對(duì)它的逐漸認(rèn)識(shí)和試用,它一定會(huì)找到適應(yīng)自己的編程環(huán)境。



          posted on 2006-06-19 12:04 nbt 閱讀(340) 評(píng)論(0)  編輯  收藏 所屬分類: Ruby On Railse技術(shù)

          <2006年6月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊(cè)

          收藏夾

          Java技術(shù)網(wǎng)站

          友情鏈接

          國(guó)內(nèi)一些開(kāi)源網(wǎng)站

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 贵阳市| 驻马店市| 定结县| 酉阳| 永宁县| 梓潼县| 尖扎县| 瑞金市| 民勤县| 阜阳市| 罗甸县| 万荣县| 巨鹿县| 龙江县| 桂东县| 乐都县| 聂拉木县| 靖宇县| 余姚市| 巴里| 五华县| 壤塘县| 高密市| 鄂尔多斯市| 乌苏市| 宁南县| 靖安县| 伊宁县| 罗甸县| 乌拉特前旗| 南投县| 永泰县| 青阳县| 井研县| 女性| 美姑县| 玉树县| 滁州市| 商丘市| 卢氏县| 文昌市|