糅和,也譯作混合插入,也許就稱作 Mix-in 比較合適。
現實生活中,一個乒乓球不僅是球類物體,也是有彈性的物體。 C++ 支持多重繼承,多重繼承有時會導致繼承關係的混亂,Java只提供了單繼承,通過接口可以得到多重繼承的優點,又沒有多重繼承的缺點。Ruby 也是單繼承,不是通過接口,而是通過Mix-in 模塊,來實現多重繼承的優點。
模塊的第三個作用:實現了類似多重繼承的功能。
我們有一個Student類,有着Person類的屬性和方法,還會做數學題——求平方根。已經有了Me模塊,只要Mix-in 在Student類裏就可以了。
看程序 E7.3-1.rb :
ruby 代碼
- #E7.3-1.rb
- module Me
- def sqrt(num, rx=1, e=1e-10)
- num*=1.0
- (num - rx*rx).abs
- end
- end
- class Person
- def talk
- puts "I'm talking."
- end
- end
- class Student < Person
- include Me
- end
- aStudent=Student.new
- aStudent.talk # => I'm talking.
- puts aStudent.sqrt(20.7,3.3) # => 4.54972526643248
通過“ < 父類名 ” ,一個子類可以得到父類的屬性和方法;通過“ include模塊名 ” ,一個子類可以得到某個模塊的常量和方法。類不能被 include 。
與include 方法相對應的,還有一個 extend 方法。如果並不是Student類的每個對象都會求平方根,只有某一個學生會,如何辦到呢?
看程序 E7.3-2.rb :
- #E7.3-2.rb
- module Me
- def sqrt(num, rx=1, e=1e-10)
- num*=1.0
- (num - rx*rx).abs
- end
- end
- class Student
- end
- aStudent=Student.new
- aStudent.extend(Me)
- puts aStudent.sqrt(93.1, 25) # => 9.64883412646315
include 方法爲一個類的所有對象包含某個模塊; extend 方法爲一個類的某個對象包含某個模塊。
完整閱讀,請看我寫的 Ruby語言中文教程all in one