一些程式語言(如C++和CLOS)提供了多重繼承機制:一個類可以繼承自多個超類。例如,一個House可能繼承自一個Building類(連同Office和Hospital類一起)和Residence類(連同Apartment類一起)。儘管多重繼承可能成為一種語言強有力的特徵,但是由於它會增加該語言的複雜性和歧義,因此許多物件導向語言都沒有加入它。
Ruby支援單繼承。然而,它還提供了mixin-它提供了多繼承的許多特徵。一個mixin是一種"模組"類型。為此,你必須首先理解在Ruby中模組的含義。
在Ruby中,模組是一種把方法和常數分組的方式。它與類相似,但是一個模組沒有執行個體並且也沒有子類。也許解釋模組的最好方法是舉一個例子。假定你正在開發一個製造業應用程式。該程式需要存取大量的科學公式和常數,那麼你可以或者是建立一個通用類來把這些放在其中或者是建立一個模組。模組的優點在於,在存取其中的公式時,根本沒有任何執行個體擾亂所帶來的煩惱。
module Formulas
ACCELERATION = 9.8
LIGHTSPEED = 299792458
def energy (mass)
mass*(LIGHTSPEED**2)
end
def force (mass)
mass*ACCELERATION
end
end
現在,這些公式方法和常數可以被任何數目的其它類或其自身所使用:
irb(main):046:0>Formulas.force(10)=>98.0irb(main):047:0≫Formulas::ACCELERATION=≫ 9.8
注意,為了調用一個模組方法或使用一個模組常數,你必須使用類似於調用一個類方法的標誌。為了調用一個模組方法,你需要使用模組類名,後面跟著一個點,再跟著模組方法名。為了引用模組常數,你可以使用模組名,後面跟著兩個冒號,再跟著常數名。
除了作為方法和常數的"公用"應用以外,模組還可以協助定義多重繼承。一個mixin是一個簡單的"包括"有一個類定義的模組。當一個類包括一個模組時,所有的模組中的方法和常數都成為類的執行個體方法和常數。例如,假定上面定義的Formula模組作為一個mixin被添加到Rectangle類。為此,你要使用"include"關鍵字:
class Rectangle
include Formulas
end