7.3 糅和(Mix-in) 與多重繼承

糅和,也譯作混合插入,也許就稱作 Mix-in 比較合適。
現實生活中,一個乒乓球不僅是球類物體,也是有彈性的物體。 C++ 支持多重繼承,多重繼承有時會導致繼承關係的混亂,Java只提供了單繼承,通過接口可以得到多重繼承的優點,又沒有多重繼承的缺點。Ruby 也是單繼承,不是通過接口,而是通過Mix-in 模塊,來實現多重繼承的優點。
模塊的第三個作用:實現了類似多重繼承的功能。

我們有一個Student類,有着Person類的屬性和方法,還會做數學題——求平方根。已經有了Me模塊,只要Mix-in 在Student類裏就可以了。
看程序 E7.3-1.rb :

ruby 代碼

  1. #E7.3-1.rb     
  2.   
  3. module Me   
  4.   def sqrt(num, rx=1, e=1e-10)   
  5.     num*=1.0   
  6.      (num - rx*rx).abs 
  7.   end  
  8. end  
  9.   
  10. class Person    
  11.   def talk   
  12.     puts "I'm talking."       
  13.   end     
  14. end  
  15.   
  16. class Student < Person   
  17.   include Me   
  18. end  
  19.   
  20. aStudent=Student.new  
  21. aStudent.talk                # =>  I'm talking.   
  22. puts aStudent.sqrt(20.7,3.3)    # =>  4.54972526643248   


通過“ < 父類名 ” ,一個子類可以得到父類的屬性和方法;通過“ include模塊名 ” ,一個子類可以得到某個模塊的常量和方法。類不能被 include 。
與include 方法相對應的,還有一個 extend 方法。如果並不是Student類的每個對象都會求平方根,只有某一個學生會,如何辦到呢?
看程序 E7.3-2.rb :

ruby 代碼
  1. #E7.3-2.rb     
  2.   
  3. module Me   
  4.   def sqrt(num, rx=1, e=1e-10)   
  5.     num*=1.0   
  6.    (num - rx*rx).abs 
  7.   end  
  8. end  
  9.   
  10. class Student     
  11. end  
  12.   
  13. aStudent=Student.new  
  14. aStudent.extend(Me)   
  15. puts aStudent.sqrt(93.1, 25)  # =>  9.64883412646315  

include 方法爲一個類的所有對象包含某個模塊; extend 方法爲一個類的某個對象包含某個模塊。  


完整閱讀,請看我寫的 Ruby語言中文教程all in one    
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章