免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2549 | 回复: 0
打印 上一主题 下一主题

Ruby中的Mixin [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-17 17:12 |只看该作者 |倒序浏览
Ruby中的Mixin






当我们谈到继承,我们通常会分开为接口继承和实现继承。如果是单继承,无论是实现继承还是接口继承,都容易理解和使用。即便如此,在C++的著作中,还是提到当我们在继承一个类的时候,不仅仅要想到继承了实现,还要想到一并继承了接口。



多继承更是复杂,很容易走到菱形继承这样一个怪圈。在C#中,只有接口的多继承,并没有实现的多继承——我们不可以指定两个或两个以后的类作为父类。



Ruby中的Mixin是对多重实现继承的一个实现,即实现部分以模块的方式单独出来,模块有其特有的属性,比如不能实例化,不能继承别的类和被别的类继承等 。松本有一个例子很好:
  1. view sourceprint?
  2. 01 module WriteStream  

  3. 02     def write(str)  

  4. 03         puts str  

  5. 04     end

  6. 05        

  7. 06     def conflict  

  8. 07         puts "conflict"

  9. 08     end

  10. 09 end

  11. 10   

  12. 11 module ReadStream  

  13. 12     def read  

  14. 13         puts "read data"

  15. 14     end

  16. 15   

  17. 16     def conflict  

  18. 17         puts "conflict-read"

  19. 18     end

  20. 19 end

  21. 20   

  22. 21 class Stream  

  23. 22     def getstream  

  24. 23         puts "get stream"

  25. 24     end

  26. 25 end

  27. 26   

  28. 27 class ReadWriteStream < Stream  

  29. 28     include WriteStream  

  30. 29     include ReadStream  

  31. 30 end

  32. 31   

  33. 32 rw = ReadWriteStream.new

  34. 33 rw.getstream  

  35. 34 rw.read  

  36. 35 rw.write("haha")  

  37. 36 rw.conflict
复制代码
这个例子就是网络编程中常常会用到的Stream,ReadStream,WriteStream, ReadWriteStream,在C++中这常常是一个菱形继承,而Ruby巧妙地采用了Mixin,从而避免了菱形继承。

在Ruby下的运行结果为:
  1. view sourceprint?
  2. 1 get stream  

  3. 2 read data  

  4. 3 haha  

  5. 4 conflict-read
复制代码
即使这样,还是回避不了最根本的问题:方法Resolve,即决定到底使用谁的方法。我们在上例中故意制造了一个冲突的方法conflict,我们从运行结果可以看到方法Resolve中结果是ReadStream的conflict方法。我们可以将程序的28行和29行对调:
  1. view sourceprint?
  2. 1 include ReadStream  

  3. 2 include WriteStream
复制代码
这时我们再次运行这段脚本,结果如下:
  1. view sourceprint?
  2. 1 get stream  

  3. 2 read data  

  4. 3 haha  

  5. 4 conflict
复制代码
注意最后一行,调用conflict方法结果的差别,我们可以知道Ruby中的Mixin是基于include时的顺序来决定方法调用的顺序。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP