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    
 

你可能感兴趣的:(Ruby入门,Ruby,生活,C,C++,C#)