糅和,也译作混合插入,也许就称作 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 :
ruby 代码
- #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