Ruby中的Mixin
当我们谈到继承,我们通常会分开为接口继承和实现继承。如果是单继承,无论是实现继承还是接口继承,都容易理解和使用。即便如此,在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相关推荐
- Python中的Mixin详解
一些闲聊: Mixin是一种设计模式.设计思想 并不是某个特定的class或者函数. Java中的Mixin叫interface Ruby中的Mixin叫Module [2]优点: 1.mixin设计 ...
- Ruby中的设计模式
继续 上 节讲述过的Singleton . Proxy 及 Iterator各模式,本节再来考察几个别的设计模式.下面按顺序来考察 Prototype . Template Method 和 Obse ...
- Ruby中的设计模式——《松本行弘的程序世界》
< 设计模式 > 一书是用C++ 和 Smalltalk 介绍模式实例的.看了那些例子,大家都会感觉到,绝大多数的模式用 Smalltalk 实现起来非常简单.这是为什么呢? 因为Smal ...
- Ruby中爬虫的实现
2019独角兽企业重金招聘Python工程师标准>>> Ruby中实现网页抓取,一般用的是mechanize,使用非常简单. 安装 sudo gem install mechaniz ...
- Ruby中的require_relative和require有什么区别?
本文翻译自:What is the difference between require_relative and require in Ruby? Ruby中的require_relative和re ...
- 在Ruby中获取system()调用的输出
本文翻译自:Getting output of system() calls in Ruby 如果我在Ruby中使用Kernel#system调用命令,我该如何获得它的输出? system(" ...
- 为什么在Ruby中使用`rescue Exception =gt; e`样式不好?
本文翻译自:Why is it bad style to `rescue Exception => e` in Ruby? Ryan Davis's Ruby QuickRef says (wi ...
- map(&:name)在Ruby中是什么意思?
我在RailsCast中找到了以下代码: def tag_names@tag_names || tags.map(&:name).join(' ') end 什么是(&:name)在m ...
- 如何在Ruby中写入文件?
我需要从数据库中读取数据,然后将其保存在文本文件中. 我怎么能在Ruby中做到这一点? Ruby中有文件管理系统吗? #1楼 在大多数情况下,这是首选方法: File.open(yourfile, ' ...
最新文章
- 图像风格迁移也有框架了
- E - Right-Left Cipher CodeForces - 1087A (模拟)
- Linux下date命令的修改时间问题
- Android之上下文菜单创建
- hashmap允许null键和值吗_hashMap底层源码浅析
- Sencha Touch2 -- 11.1:定义具有关联关系的模型
- OpenCV中Mat的属性
- cors解决ajax跨域
- MySQL数据类型-decimal详解
- DT时代下 数据库灾备的探索与实践
- 微信公众号大转盘抽奖活动链接怎么添加
- 电脑如何进入bios模式_如何进入BIOS设置U盘启动盘
- C++函数重载解析细节
- 常用的五种大数据分析方法
- WPF仿微软事件和属性窗体,效果更炫!
- mysql数据库原理及应用实训报告_《数据库原理及应用》实验报告.doc
- linux centos7 利用keepalived 搭建高可用nginx集群
- 第十八篇 难点突破之-VUE中使用 C-LODOP 实现模板的套打
- 滴滴程序员年薪80万却被亲戚鄙视:钱多有啥用,我儿子二本大学教师
- 2020中国隧道与地下工程大会(CTUC)暨中国土木工程学会隧道及地下工程分会第二十一届年会
热门文章
- sicily 1156 ——虽然Wrong error(原因尚未查明),但温习了一下基础知识
- ASP.NET2.0_缓存
- Science报道新研究:同行评审后的研究仅比预印本研究质量提高4%
- 谷歌CEO支持欧盟禁止人脸识别!微软总裁:能用“手术刀”就别用“切肉刀”...
- MASTER:全局上下文建模大幅提高文本识别精度
- 对于python初学者,如何使用python定义联合(使用ctypes)?
- linux系统解锁用户百度,详细到没朋友,一文帮你理清Linux 用户与用户组关系~
- alinq mysql_ALinq 使用教程(移植 Linq to SQL 的利器)
- 收藏 | 佐治亚理工出品交互式线代教科书!
- 面向小姐姐的编程——JAVA面向对象之继承(二)