ruby的module與Java的interface以及C++的friend

   ModuleRuby一個非常好用的功能,它跟Class類別非常相似,你可以在裏面定義方法。只是你不能用new來建立它。它的第一個用途是可以當做Namespace來放一些工具方法:

  1. module MyUtil       
  2.     def self.foobar 
  3.     puts "foobar" 
  4.   end  
  5. end   
  6.  
  7. MyUtil.foobar # 輸出 foobar 

        另一個更重要的功能是Mixins,可以將一個Module混入類別之中,這樣這個類別就會擁有此Module的方法。這回讓我們拆成兩個wenji,debug.rbfoobar.rb,然後在foobar.rb中用引用debug.rb

        首先是debug.rb:

  1. module Debug      
  2.     def who_am_i? 
  3.         puts "#{self.class.name}: #{self.inspect}"      
  4.     end  
  5. end 

然後是foobar.rb:

  1. require "./debug"  
  2. class Foo      
  3.     include Debug # 這個動作叫做 Mixin  
  4. end   
  5.  
  6. class Bar      
  7.     include Debug  
  8. end 
  9.  
  10. a = Foo.new  
  11. b = Bar.new  
  12. a.who_am_i? # 輸出 Foo: #<Foo:0x00000102829170>  
  13. b.who_am_i? # 輸出 Bar: #<Bar:0x00000102825b88> 

       Ruby使用Module來解決多重繼承的問題,不同類別之間只要擁有相同的方法,就可以改放在Module裏面,然後include它即可。

        Java中的interface可以解決多重繼承的缺陷,C++是支持多重繼承的,而且有一個元友的概念。我認爲ruby的include module更像C++的friend class的功能。

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