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

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

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

module WriteStreamdef write(str)puts strenddef conflictputs "conflict"end
endmodule ReadStreamdef readputs "read data"enddef conflictputs "conflict-read"end
endclass Streamdef getstreamputs "get stream"end
endclass ReadWriteStream < Streaminclude WriteStreaminclude ReadStream
endrw = ReadWriteStream.new
rw.getstream
rw.read
rw.write("haha")
rw.conflict

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

在Ruby下的运行结果为:

get stream
read data
haha
conflict-read

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

   include ReadStreaminclude WriteStream

这时我们再次运行这段脚本,结果如下:

get stream
read data
haha
conflict

注意最后一行,调用conflict方法结果的差别,我们可以知道Ruby中的Mixin是基于include时的顺序来决定方法调用的顺序

转载于:https://www.cnblogs.com/Jerry-Chou/archive/2011/11/17/2252230.html

Ruby中的Mixin相关推荐

  1. Python中的Mixin详解

    一些闲聊: Mixin是一种设计模式.设计思想 并不是某个特定的class或者函数. Java中的Mixin叫interface Ruby中的Mixin叫Module [2]优点: 1.mixin设计 ...

  2. Ruby中的设计模式

    继续 上 节讲述过的Singleton . Proxy 及 Iterator各模式,本节再来考察几个别的设计模式.下面按顺序来考察 Prototype . Template Method 和 Obse ...

  3. Ruby中的设计模式——《松本行弘的程序世界》

    < 设计模式 > 一书是用C++ 和 Smalltalk 介绍模式实例的.看了那些例子,大家都会感觉到,绝大多数的模式用 Smalltalk 实现起来非常简单.这是为什么呢? 因为Smal ...

  4. Ruby中爬虫的实现

    2019独角兽企业重金招聘Python工程师标准>>> Ruby中实现网页抓取,一般用的是mechanize,使用非常简单. 安装 sudo gem install mechaniz ...

  5. Ruby中的require_relative和require有什么区别?

    本文翻译自:What is the difference between require_relative and require in Ruby? Ruby中的require_relative和re ...

  6. 在Ruby中获取system()调用的输出

    本文翻译自:Getting output of system() calls in Ruby 如果我在Ruby中使用Kernel#system调用命令,我该如何获得它的输出? system(" ...

  7. 为什么在Ruby中使用`rescue Exception =gt; e`样式不好?

    本文翻译自:Why is it bad style to `rescue Exception => e` in Ruby? Ryan Davis's Ruby QuickRef says (wi ...

  8. map(&:name)在Ruby中是什么意思?

    我在RailsCast中找到了以下代码: def tag_names@tag_names || tags.map(&:name).join(' ') end 什么是(&:name)在m ...

  9. 如何在Ruby中写入文件?

    我需要从数据库中读取数据,然后将其保存在文本文件中. 我怎么能在Ruby中做到这一点? Ruby中有文件管理系统吗? #1楼 在大多数情况下,这是首选方法: File.open(yourfile, ' ...

最新文章

  1. 图像风格迁移也有框架了
  2. E - Right-Left Cipher CodeForces - 1087A (模拟)
  3. Linux下date命令的修改时间问题
  4. Android之上下文菜单创建
  5. hashmap允许null键和值吗_hashMap底层源码浅析
  6. Sencha Touch2 -- 11.1:定义具有关联关系的模型
  7. OpenCV中Mat的属性
  8. cors解决ajax跨域
  9. MySQL数据类型-decimal详解
  10. DT时代下 数据库灾备的探索与实践
  11. 微信公众号大转盘抽奖活动链接怎么添加
  12. 电脑如何进入bios模式_如何进入BIOS设置U盘启动盘
  13. C++函数重载解析细节
  14. 常用的五种大数据分析方法
  15. WPF仿微软事件和属性窗体,效果更炫!
  16. mysql数据库原理及应用实训报告_《数据库原理及应用》实验报告.doc
  17. linux centos7 利用keepalived 搭建高可用nginx集群
  18. 第十八篇 难点突破之-VUE中使用 C-LODOP 实现模板的套打
  19. 滴滴程序员年薪80万却被亲戚鄙视:钱多有啥用,我儿子二本大学教师
  20. 2020中国隧道与地下工程大会(CTUC)暨中国土木工程学会隧道及地下工程分会第二十一届年会

热门文章

  1. sicily 1156 ——虽然Wrong error(原因尚未查明),但温习了一下基础知识
  2. ASP.NET2.0_缓存
  3. Science报道新研究:同行评审后的研究仅比预印本研究质量提高4%
  4. 谷歌CEO支持欧盟禁止人脸识别!微软总裁:能用“手术刀”就别用“切肉刀”...
  5. MASTER:全局上下文建模大幅提高文本识别精度
  6. 对于python初学者,如何使用python定义联合(使用ctypes)?
  7. linux系统解锁用户百度,详细到没朋友,一文帮你理清Linux 用户与用户组关系~
  8. alinq mysql_ALinq 使用教程(移植 Linq to SQL 的利器)
  9. 收藏 | 佐治亚理工出品交互式线代教科书!
  10. 面向小姐姐的编程——JAVA面向对象之继承(二)