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ù)