免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8660 | 回复: 4

ruby扫盲之多重继承 [复制链接]

论坛徽章:
0
发表于 2010-11-26 12:05 |显示全部楼层
ruby的类是单一继承的方式,某个类只可以继承自一个父类。但是ruby的mixin让多重继承变得很容易。
ruby引入了module的概念,module除了自身不能实例化外,拥有跟类几乎一样的属性,包括实例方法、实例变量等。
(当然,它的实例方法、实例变量只有通过include它的类被实例化后,才真正称之为“实例”。)


通过在类里include module,可以混入(mixin)其方法和属性,那么类等于实现了多重继承。
如下示例代码:
  1. module Mymod
  2.    attr_reader :names

  3.    def set_up(a)
  4.       @names = a
  5.    end

  6.    def add_name(name)
  7.      @names << name
  8.    end

  9.    def rm_name(name)
  10.      @names.delete(name)
  11.    end
  12. end


  13. class Myclass < Array
  14.    include Mymod

  15.    def initialize(*a)
  16.       super(a)
  17.       set_up(a)
  18.    end
  19. end

  20. x = Myclass.new("jessi","jane","joan")

  21. x.push("jenn")
  22. x.add_name("jeff")

  23. x.delete("jane")
  24. x.rm_name("jessi")

  25. p x
  26. p x.names
复制代码
先创建一个module,在里面定义了@name实例变量,和set_up、add_name、rm_name几个实例方法。
然后再定义一个类,这个类继承自Array(父类数组),然后在该类里include了上述module。

在类的构造器里,先调用super构造父类对象,再调用module里的set_up方法设置实例变量。

x = Myclass.new("jessi","jane","joan")


这样得到的对象x是一个数组对象,它既可以执行数组的方法(如push、delete),也可以执行module的方法(add_name、rm_name)。

一个类可以include多个module。通过这种方式,类也就实现了多重继承。


几点补充:

1. 类自身也是module:

> Class.is_a? Module
=> true


2. 类不是简单的拷贝module的实例方法,而是创建到module的引用。module的方法修改时,会影响到所有include它的类。

3. module也有initialize方法,类可以通过super来调用它。

论坛徽章:
0
发表于 2010-11-27 11:05 |显示全部楼层
不错不错啊。

论坛徽章:
0
发表于 2011-02-22 18:58 |显示全部楼层
mark一下

论坛徽章:
3
CU大牛徽章
日期:2013-03-14 14:14:08CU大牛徽章
日期:2013-03-14 14:14:26CU大牛徽章
日期:2013-03-14 14:14:29
发表于 2011-03-03 05:38 |显示全部楼层
写的很好。{:2_176:}

论坛徽章:
0
发表于 2011-11-19 23:32 |显示全部楼层
写的很好。LZ继续哦。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP