象大多數物件導向語言一樣,Ruby類也允許定義類變數和方法。一個類變數允許在一個類的所有執行個體間共用單個變數。在Ruby中,兩個@@號用於指示類變數。例如,如果你想要使一個BankAccount類的所有執行個體共用相同的利息率,那麼該類可能被如下定義:
class BankAccount@@interestRate = 6.5def BankAccount.getInterestRate()@@interestRateendattr_accessor :balancedef initialize (bal)@balance = balendend
如你所見,類變數必須在使用前初始化,並且就象執行個體變數一樣,如果你想存取類變數的話,你需要編寫存取器方法。在此,我定義了一個類方法來返回利息率。注意,類名和在getInterestRate前面的句號表示一個類方法。一個類方法,不管對於任何執行個體,其工作方式都是相同的-在此,是把相同的利息率返回到所有的BankAccount執行個體。為了調用類方法,你需要使用類名,就象它使用於類方法定義中一樣:
irb(main):045:0> BankAccount.getInterestRate=> 6.5
事實上,用於建立類執行個體的"new"方法就是一個類方法。因此,當你在程式中輸入"Rectangle.new"時,你實際在調用new類方法-這是Ruby預設情況下所提供的。
繼承
物件導向編程的原則之一是支援類階層。就象自然界中的事物分類一樣,類允許從更為通用的類進行繼承。物件導向編程的特徵主要體現在方法和變數的使用上。例如,一個Square類繼承Rectangle類的一些特徵,如方法和變數。一個Square是一種更具體類型的Rectangle(高度和寬度相等的Rectangle執行個體),但是它仍然有一個高度和寬度,也有一個面積(而且與矩形的計算方法相同)。在Ruby中,Square類可以使用下列定義建立:
class Square < Rectangleend
"<Rectangle"意味著,Square是Rectangle的一個子類,或反過來說,Rectangle是Square的一個超類。預設情況下,一個Square執行個體自動地擁有所有一個Rectangle所擁有的相同的屬性和方法,包括height,width和area方法。為了確保Square執行個體的邊長相等,你可以重載現有的Square的initialize方法:
class Square < Rectangledef initialize (size)@height = size@width = sizeendend