Ruby中关于模块的一些基础知识
模块与类很相似,它也可以说成是“不能被实例化的类”。由于Class类是Module类的子类,所以说成是“类=模块+实例化能力”也许更好。 所谓模块,究竟是用来干什么的呢?其作用主要有两大类:Mix-in和命名空间。 Mix-in实际上是受限制的多重继承。利用实际做成的继承关系,可以实现对某些类进行一些“点缀”的目的。事实上,Mix-in这种说法就来自于在冰激凌上面的饼干或者坚果。 在面向对象设计的历史中,由多重继承机制造成的问题早已众所周知了。所以,很多现代的面向对象设计语言都只支持单一继承的方式。Ruby就是采用的这种方式。 但是,多重继承机制也有不能被割舍的魅力。因此Ruby通过采用Mix-in的方式引入了很多多重继承的优点。 一个类如果同时继承了多个类,就会很容易在面向对象设计上出现很多问题。因此,Ruby加入了以下限制: 1、 只能继承一个类 2、 可以继承多个所谓的“像类但不是类”的模块 此外,Ruby把“在类中加入模块”的动作称为include。 模块的另一个功能是提供命名空间 在大规模的程序开发中,命名冲突的问题经常会出现。比如读者在程序中需要制作一个名为Service的类,但是Service这个名字却已经在程序库中被使用了,这就是命名冲突的问题。 在很多现代的编程语言中,为了避免命名冲突的问题,基本上都提供了命名空间或者包的功能。在不同的命名空间中存在的Service类虽然类名相同,但是会被作为不同的对象来处理。 在Ruby中,通常会利用模块来提供这样的命名空间。 class Service; end module Library class Service; end end 最开始的Service类属于Top Level的命名空间,后面的Service类则属于Library模块。 这其实就是Top Level和Library模块中分别定义了名为Service的常量(类名实际上是指向class对象的常量)。 因此,在使用时就像使用常量一样。 ::Service #Top Level的Service Library::Service #Library的Service (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- c# – 如何知道超时或手动触发器是否取消了任务?
- 《Box2D for Flash Games》翻译 在世界里添加刚体(A)
- ruby-on-rails – 如何为heroku上托管的Rails应用程序设置Q
- c – 2d HUD无法在QGLWidget上正确绘制(使用QPainter)
- XML Pulisher: the macro cannot be found or has been dis
- Cocos Creator 使用计时器(摘自官方文档)
- ruby-on-rails – 自定义设备会话控制器在错误时不重定向(:
- ruby – Mac OS X Lion上的sqlite3 gem …失败了!
- cocos2d-x V3.14.1 版本更新说明
- swift – UI测试失败 – 元素和任何后代都没有键盘焦点在Te