模块帮助定义Ruby多继承
创始人
2024-06-16 04:31:07
0

虽然Ruby作为一种新语言,具有一些不同于其他语言的特性,比如没有函数,只有方法。但是它还是脱不了编程语言特有的性质。在这里我们将会为大家介绍有关Ruby多继承的相关实现方法。#t#

一些程序语言(如C++和CLOS)提供了多重继承机制:一个类可以继承自多个超类。例如,一个House可能继承自一个Building类(连同Office和Hospital类一起)和Residence类(连同Apartment类一起)。尽管多重继承可能成为一种语言强有力的特征,但是由于它会增加该语言的复杂性和歧义,因此许多面向对象语言都没有加入它。

Ruby支持单继承。然而,它还提供了mixin-它提供了Ruby多继承的许多特征。一个mixin是一种"模块"类型。为此,你必须首先理解在Ruby中模块的含义。

在Ruby中,模块是一种把方法和常数分组的方式。它与类相似,但是一个模块没有实例并且也没有子类。也许解释模块的***方法是举一个例子。假定你正在开发一个制造业应用程序。该程序需要存取大量的科学公式和常数,那么你可以或者是创建一个通用类来把这些放在其中或者是创建一个模块。模块的优点在于,在存取其中的公式时,根本没有任何实例扰乱所带来的烦恼。

 

  1. moduleFormulas  
  2. ACCELERATION=9.8  
  3. LIGHTSPEED=299792458 
  4. defenergy(mass)  
  5. mass*(LIGHTSPEED**2)  
  6. end  
  7. defforce(mass)  
  8. mass*ACCELERATION  
  9. end  
  10. end 

现在,这些公式方法和常数可以被任何数目的其它类或其自身所使用:

 

  1. irb(main):046:0>
    Formulas.force(10)  
  2. =>98.0  
  3. irb(main):047:0≫
    Formulas::ACCELERATION 
  4. =≫9.8 

注意,为了调用一个模块方法或使用一个模块常数,你必须使用类似于调用一个类方法的标志。为了调用一个模块方法,你需要使用模块类名,后面跟着一个点,再跟着模块方法名。为了引用模块常数,你可以使用模块名,后面跟着两个冒号,再跟着常数名。

除了作为方法和常数的"公共"应用以外,模块还可以帮助定义Ruby多继承。一个mixin是一个简单的"包括"有一个类定义的模块。当一个类包括一个模块时,所有的模块中的方法和常数都成为类的实例方法和常数。例如,假定上面定义的Formula模块作为一个mixin被添加到Rectangle类。为此,你要使用"include"关键字:

 

  1. classRectangle  
  2. includeFormulas  
  3. end 

现在,Rectangle的实例具有了它们可以使用的force和energy方法,并且Rectangle类能够访问常数ACCELERATION和LIGHTSPEED:

 

  1. irb(main):044:0>
    classRectangle  
  2. irb(main):045:1>
    includeFormulas  
  3. irb(main):046:1>end 
  4. =>Rectangle  
  5. irb(main):047:0>
    Rectangle.new(4,5).force(10)  
  6. =>98.0  
  7. irb(main):048:0>
    Rectangle::LIGHTSPEED 
  8. =>299792458 

这意味着,mixin给Ruby中的类带来了许多多重继承的优点,却避开了多重继承中存在的问题。

Ruby多继承控制流

象所有的程序语言一样,Ruby提供了一组控制流命令,这包括条件语句(if/else结构),case语句和循环语句(do,while和for),还提供了象Ada和Java等语言中的异常处理能力。下面是Ruby中的一些控制流语句的示例:

 

  1. ifarea>100  
  2. "big"  
  3. else  
  4. "small"  
  5. end  
  6. caseheight  
  7. |when1  
  8. |print"stubbyn"  
  9. |when2..10#高度范围为2~10  
  10. |print"shortn"  
  11. |when10..20#高度范围为2~10  
  12. |print"talln"  
  13. |end  
  14. aRect=Rectangle.new(4,6)  
  15. whileaRect.area
    <100andaRect.height<10 
  16. aRect.doubleSize()  
  17. end  
  18. forelementin[2,9.8,"
    somestring",Math::PI]
    #遍历对象集合  
  19. print"Thetypeis:"+
    element.type.to_s+"n&"  
  20. end 

控制语句通常非常直接,但是如前面的case语句和for循环语句所显示的,Ruby借鉴了其它一些语言特征和普通的面向对象的特性。

异常处理类似于Java中的"try...catch...finally"语句。在Ruby中,它们更改为"begin...rescue...ensure"语句:

 

  1. begin  
  2. #实现一些事情  
  3. rescue  
  4. ##处理错误  
  5. ensure  
  6. #做一些清理工作,
    如关闭一个打开的文件等  
  7. end 

为了在你的Ruby多继承代码中引发一个异常,你只需要简单地调用raise方法:

 

  1. ifarea<0 
  2. raise  
  3. elseifarea>0andarea<10 
  4. raise"Rectangletoosmall"  
  5. elseifarea>100  
  6. raiseTooBigException
    "Rectangletoobig"  
  7. end 

***个raise调用创建一个RuntimeError。第二个raise创建一个显示一条消息的RuntimeError。***一个raise调用一个TooBigException的新实例(由它创建一个粗略定义的错误),并设置它的适当消息。

一个Ruby多继承小程序

为了帮助你更好地掌握Ruby的基础知识,我在本文中提供了一个小程序供你学习之用。为了使这个程序工作,你可以下载并把该文件解压到你的文件系统。之后,它将创建一个examples文件夹,在这个目录下共有9个Ruby代码文件(.rb文件)。本文中的代码就包含在这些文件中。另外,你会找到一个testShapes.rb文件,它是测试Ruby的Rectangle,Square和Circle对象的主文件。只需简单地打开一个命令提示符并运行testShapes.rb文件即可。

你将注意到,在testShapes.rb和另外一些代码中,文件以"require"再加上一个文件名开头(象rectangle.rb)。这是在你的Ruby程序中加入或使用来自于其它文件代码的Ruby标志。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...