Ruby 101重用隐藏与多态.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
什么?你不想安装Ruby? ????? 在我决定把Ruby装到我的机子里之前,我想先试一下;在我试用Ruby之前,我得先把它装到我的机子里;在我决定……哎哟,死锁了…… ????? 没问题,今天我带上钥匙了!现在,请用你喜欢的浏览器打开这个网址:/,你将会看到一个网页版的irb: 图 1 现在,它已经支持到Ruby 1.9.0了,而且还有自动缩进。虽然说你可以使用你喜欢的浏览器来打开它,但实际上能用的浏览器并不多,我的机子里同时安装了IE8、FireFox 3.5、Google Chrome 3.0、Opera 10.0、Safari 4.0和Maxthon 2.5,全部更新到最新,但使用正常的只有IE8、FireFox 3.5和Maxthon 2.5,在Google Chrome 3.0和Safari 4.0上,方向键失灵,(同一行)无法回头修改,而在Opera 10.0上,按下左右2个方向键居然分别输出%和…… ????? 本来,IronRuby也有一个用Silverlight做的iirb,以前我试过能用的,可现在打开之后就空白一片了(我的机子里安装的是Silverlight 3.0),我不知道为什么,有兴趣的话你也可以试一下,地址是:/Wiki/View.aspx?title=SilverlightInteractiveSession。 ????? 虽然现在你不用安装Ruby也能体验一把了,可你不要对它抱有不切实际的幻想哟,毕竟它不是装在本机的irb,如果你要在里面读/写文件、访问SQLite或者MySQL,那么你注定要失望了,然而,对于这个系列的头几篇文章,我相信它还是胜任有余的,接下来就让我们进入今天的主题吧! ? 我不喜欢重复劳动! ????? 在上一篇文章里,我们了解到Ruby允许你重新打开一个类,并对里面的内容进行修改,我们还通过这种办法扩展了由Struct类创建的Book类(参见《Ruby 101:类和对象》的代码12),此外,我还提到可以通过继承来扩展Book类,下面,我们来看看如何在Ruby里实现继承: 代码 1 Ruby通过符号来表达继承关系,上面代码创建了一个Book1类,它继承自由Struct类创建的Book类,此外,这两部分代码还可以合二为一: 代码 2 这相当于你把创建属性的工作交给Struct类,你自己则专注于包含业务逻辑的方法。 ????? 无论你以什么方式看待继承,为它赋予何种层次的意义,你肯定不会否认它的重用功效,一般而言,面向对象语言都支持继承和组合这两种重用方式,而Ruby还支持第三种——Mixin。那么,什么是Mixin呢?设想一下,我要为Book类增加计算折扣的功能,毫无疑问,最简单的办法就是把代码直接写到Book类里: 代码 3 显然,这部分代码还可以用到其它地方,把它直接写到Book类里会使它丧失重用性,我们可以考虑把它放到辅助类里,然后通过组合在Book类里重用它,但这需要额外的代码来重定向相关的方法,我们也可以考虑把它放到基类里,然后通过继承在Book类里重用它,可是,Ruby不支持多重继承,如果将来我们发现另一个类更合适成为Book类的基类,或者像代码2的Book类那样已经有基类了,我们就会陷入困境。那么,我们该如何解决这个问题?聪明的你肯定猜到我想说什么了,嗯,现在轮到Mixin出场了,下面,我们来看看它是如何协助我们应对这种情况的。 ????? 首先,把代码抽出来,放在一个单独的模块里: 代码 4 接着通过include在Book类里把它包含进来: 代码 5 至此,我们已经通过Mixin完成了代码重用,那么,模块里的代码该如何用呢?非常简单,你把它们想象成通过代码3的方式创建,然后该怎么用就怎么用: 代码 6 噢,这简直就是,看,你无法分辨这些方法究竟是直接在Book类里创建的还是通过Mixin混进去的,太神奇了! ????? 在上一篇文章里,我们看到模块可以用作命名空间,而在本文里,我们看到模块可以用作Mixin,这是模块的两个典型用途,它们均向我们展示了模块作为代码容器这个特征,到目前为止,我们已经看到模块可以包含类(参见《Ruby 101:类和对象》的代码4)和实例方法(参见本文代码4),此外,模块还能包含什么呢? ????? 首先,我们来试试静态方法,还记得如何在类里创建静态方法吗,如果忘记了,不要紧,回去上一篇文章复习一下吧。在上一篇文章里,我们看到在类里创建静态方法的做法有4种,下面,我们尝试照搬头两种,也是最有可能行得通的两种: 图 2 实践证明,这两种做法都行得通的,另外,我们还看到,模块的静态方法和类的静态方法在调用上也是一样的,.和::都可以用来连接模块名/类名和方法名,至于使用哪一种,基本上是

文档评论(0)

bokegood + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档