Ruby的多繼承

一些程序語言(如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.0
irb(main):047:0≫Formulas::ACCELERATION
=≫ 9.8

注意,爲了調用一個模塊方法或使用一個模塊常數,你必須使用類似於調用一個類方法的標誌。爲了調用一個模塊方法,你需要使用模塊類名,後面跟着一個點,再跟着模塊方法名。爲了引用模塊常數,你可以使用模塊名,後面跟着兩個冒號,再跟着常數名。

除了作爲方法和常數的"公共"應用以外,模塊還可以幫助定義多重繼承。一個mixin是一個簡單的"包括"有一個類定義的模塊。當一個類包括一個模塊時,所有的模塊中的方法和常數都成爲類的實例方法和常數。例如,假定上面定義的Formula模塊作爲一個mixin被添加到Rectangle類。爲此,你要使用"include"關鍵字:

class Rectangle
  include Formulas
end

現在,Rectangle的實例具有了它們可以使用的force和energy方法,並且Rectangle類能夠訪問常數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中的類帶來了許多多重繼承的優點,卻避開了多重繼承中存在的問題。

發佈了42 篇原創文章 · 獲贊 6 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章