Ruby程序設(shè)計(jì)語(yǔ)言快速入門(mén)(四)----之類變量和類方法

          象大多數(shù)面向?qū)ο笳Z(yǔ)言一樣,Ruby類也允許定義類變量和方法。一個(gè)類變量允許在一個(gè)類的所有實(shí)例間共享單個(gè)變量。在Ruby中,兩個(gè)@@號(hào)用于指示類變量。例如,如果你想要使一個(gè)BankAccount類的所有實(shí)例共享相同的利息率,那么該類可能被如下定義:

          class BankAccount
          @@interestRate = 6.5
          def BankAccount.getInterestRate()
          @@interestRate
          end
          attr_accessor :balance
          def initialize (bal)
          @balance = bal
          end
          end

            如你所見(jiàn),類變量必須在使用前初始化,并且就象實(shí)例變量一樣,如果你想存取類變量的話,你需要編寫(xiě)存取器方法。在此,我定義了一個(gè)類方法來(lái)返回利息率。注意,類名和在getInterestRate前面的句號(hào)表示一個(gè)類方法。一個(gè)類方法,不管對(duì)于任何實(shí)例,其工作方式都是相同的-在此,是把相同的利息率返回到所有的BankAccount實(shí)例。為了調(diào)用類方法,你需要使用類名,就象它使用于類方法定義中一樣:

          irb(main):045:0> BankAccount.getInterestRate
          => 6.5

            事實(shí)上,用于創(chuàng)建類實(shí)例的"new"方法就是一個(gè)類方法。因此,當(dāng)你在程序中輸入"Rectangle.new"時(shí),你實(shí)際在調(diào)用new類方法-這是Ruby默認(rèn)情況下所提供的。

            繼承

            面向?qū)ο缶幊痰脑瓌t之一是支持類層次結(jié)構(gòu)。就象自然界中的事物分類一樣,類允許從更為通用的類進(jìn)行繼承。面向?qū)ο缶幊痰奶卣髦饕w現(xiàn)在方法和變量的使用上。例如,一個(gè)Square類繼承Rectangle類的一些特征,如方法和變量。一個(gè)Square是一種更具體類型的Rectangle(高度和寬度相等的Rectangle實(shí)例),但是它仍然有一個(gè)高度和寬度,也有一個(gè)面積(而且與矩形的計(jì)算方法相同)。在Ruby中,Square類可以使用下列定義創(chuàng)建:

          class?Square?<?Rectangle
          end?

            "<Rectangle"意味著,Square是Rectangle的一個(gè)子類,或反過(guò)來(lái)說(shuō),Rectangle是Square的一個(gè)超類。默認(rèn)情況下,一個(gè)Square實(shí)例自動(dòng)地?fù)碛兴幸粋€(gè)Rectangle所擁有的相同的屬性和方法,包括height,width和area方法。為了確保Square實(shí)例的邊長(zhǎng)相等,你可以重載現(xiàn)有的Square的initialize方法:

          class?Square?<?Rectangle
          def?initialize?(size)
          @height?=?size
          @width?=?size
          end
          end?

            因?yàn)樵赗uby中一切都是對(duì)象,所以Ruby中的一切幾乎都派生自O(shè)bject類。盡管這在所有類定義中都不是顯式的(你不會(huì)看到<Object出現(xiàn)在定義中),但是的確所有的類都派生自Ruby的基類Object。知道這個(gè)事實(shí)后,你就會(huì)更容易地理解接下來(lái)要討論的內(nèi)容。

            當(dāng)編寫(xiě)你的應(yīng)用程序時(shí),你可以在一個(gè)類定義外定義方法。在本文開(kāi)始,你已看到了一個(gè)并不是任何一個(gè)類的一部分的攝氏到華氏轉(zhuǎn)換器方法。作為另外一個(gè)示例,下面是一個(gè)位于任何類之外的方法:

          def?feel?
          return?"I?feel?fine."
          end?

            為了執(zhí)行這個(gè)方法,只要輸入該方法名,而不需要類或?qū)嵗?/font>

          irb(main):042:0>?feel?
          =>?"I?feel?fine."?

            此方法看似另外一種語(yǔ)言(如C)中的函數(shù)或過(guò)程。事實(shí)上,盡管這些方法看上去好象不屬于任何類,但是這些方法卻都是你已經(jīng)添加到Object類上的方法,它(因?yàn)镺bject是所有類的超類)反過(guò)來(lái)也把這一方法添加到你的繼承類上。因此,現(xiàn)在你可以在任何對(duì)象(如Square和Rectangle的實(shí)例)甚至一個(gè)類(如Rectangle類)上調(diào)用這個(gè)方法。

          irb(main):043:0>?sq1=Square.new(4)
          =>?#<Square:0x5a18b50?@width=4,?@height=4>
          irb(main):044:0>?rect1=Rectangle.new(5,7)
          =>?#<Rectangle:0x5a139a8?@width=7,?@height=5>
          irb(main):045:0>?sq1.feel?
          =>?"I?feel?fine."
          irb(main):046:0>?rect1.feel?
          =>?"I?feel?fine."
          irb(main):047:0>?Rectangle.feel?
          =>?"I?feel?fine."



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

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

          導(dǎo)航

          統(tǒng)計(jì)

          • 隨筆 - 88
          • 文章 - 7
          • 評(píng)論 - 66
          • 引用 - 0

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊(cè)

          收藏夾

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

          友情鏈接

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

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 98121
          • 排名 - 588

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 永济市| 杂多县| 桐柏县| 新竹市| 孝昌县| 岳阳市| 贵州省| 耒阳市| 黔西| 定边县| 巴楚县| 乐安县| 丹江口市| 永州市| 普格县| 珲春市| 运城市| 隆回县| 博乐市| 宁陵县| 准格尔旗| 富民县| 运城市| 临猗县| 灵丘县| 独山县| 雷波县| 仲巴县| 宕昌县| 邳州市| 平原县| 同仁县| 都安| 新宾| 开原市| 玉屏| 思南县| 鄢陵县| 义乌市| 上犹县| 翁牛特旗|