2007-02-13
7.3 糅和(Mix-in) 与多重继承
糅和,也译作混合插入,也许就称作 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
发表评论
- 浏览: 48123 次
- 性别:


- 详细资料
搜索本博客
最近加入圈子
最新评论
-
3.1 注释与分行
正想知道ruby是怎么样生成像javadoc那样的文档,多谢了.
-- by yangzhihuan -
变量一定要有类型吗(一)
从lambda演算的角度说我们并不关心一个东西到底是什么,而只看作一个符号并定义 ...
-- by whisper -
变量一定要有类型吗(一)
这个问题还需要讨论啊!...无语了...
-- by wiwolf -
变量一定要有类型吗(一)
假设若干年后,有一篇搜索引擎报告指出:A)21世纪初期,网络信息以中文和英文居多 ...
-- by dustinth -
变量一定要有类型吗(一)
more: http://en.wikipedia.org/wiki/Type ...
-- by aardvark






评论排行榜