程序设计与方法学课程论文-Ruby语言面向对象的分析及简单实现.doc_第1页
程序设计与方法学课程论文-Ruby语言面向对象的分析及简单实现.doc_第2页
程序设计与方法学课程论文-Ruby语言面向对象的分析及简单实现.doc_第3页
程序设计与方法学课程论文-Ruby语言面向对象的分析及简单实现.doc_第4页
程序设计与方法学课程论文-Ruby语言面向对象的分析及简单实现.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

程序设计与方法学课程论文 Ruby语言面向对象的分析及简单实现 学号:2014282110175 姓名: 专业:计算机技术 摘要:本文首先介绍了面向对象编程中的概念和特性,主要分析了近几年比较流行的脚本语言Ruby的一些基本语言原理和特性,并通过实例测试了该语言的面向对象的实现过程,可以使我们能更加了解Ruby的特性及其与其他语言的不同,同时对Ruby的应用有更加直观的体会,有助于提高Ruby程序设计效率。 关键词:程序语言原理,Ruby,面向对象1.介绍 Ruby,是在20世纪90年代由日本人松本行弘开发的,为了简单快捷的面向对象编程而创的脚本语言,在最新一期的TIOBE编程语言排行榜上,Ruby位列第16位。Ruby是一种通用的,解释型的编程语言,具有很强大的开发能力,目前主要的应用在于web应用的开发,基于Ruby的web应用框架Ruby on Rails已经成为了最流行的开发框架之一。 根据作者松本行弘,Ruby的理念是减少编程时候的不必要的琐碎时间,令编写程序的人高兴,其次是良好的界面设计。他强调系统设计必须注重人性化,而不是一味从机器的角度设想。遵循上述的理念,Ruby 语言通常非常直观,按照编程人认为它应该的方式运行。Ruby的主要特点就是完全面向对象,在Ruby语言中,任何东西都是对象,包括其他语言中的基本数据类型,比如整数。变量没有类型,Ruby的变量可以保存任何类型的数据。任何东西都有值,不管是数学或者逻辑表达式还是一个语句,都会有值。Ruby中的运算符只是一种语法机制,为相应运算指明具体的方法调用,而这些运算符也可以重新定义。所有类,不管是预先定义的还是用户自定义的,都可以有子类。同时,由于使用动态类型,Ruby中不需要声明变量。而变量的作用域是通过名称来指定的:名称以字母开头的变量具有局部作用域;名称以开头的变量是实例变量;名称以$开头的变量具有全局作用域。在本文中,我们主要的讨论点是面向对象,面向对象(Object Oriented,OO)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。2.面向对象介绍 2.1概念对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。对象的状态和行为,对象具有状态,一个对象用数据值来描述它的状态,对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为,对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中类,具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。类的结构,在客观世界中有若干类,这些类之间有一定的结构关系。通常有两种主要的结构关系,即一般-具体结构关系,整体-部分结构关系。一般-具体结构称为分类结构,也可以说是“或”关系,或者是“is a”关系。整体-部分结构称为组装结构,它们之间的关系是一种“与”关系,或者是“has a”关系。消息和方法,对象之间进行通信的结构叫做消息。在对象的操作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。发送一条消息至少要包括说明接受消息的对象名、发送给该对象的消息名(即对象名、方法名)。一般还要对参数加以说明,参数可以是认识该消息的对象所知道的变量名,或者是所有对象都知道的全局变量名。类中操作的实现过程叫做方法,一个方法有方法名、返回值、参数、方法体。2.2特征对象唯一性,每个对象都有自身唯一的标识,通过这种标识,可找到相应的对象。在对象的整个生命期中,它的标识都不改变,不同的对象不能有相同的标识。抽象性,抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类,一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。继承性,继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系,在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容,继承性是面向对象程序设计语言不同于其它语言的最重要的特点,是其他语言所没有的。在类层次中,子类只继承一个父类的数据结构和方法,则称为单重继承,子类继承了多个父类的数据结构和方法,则称为多重继承。而在在软件开发中,类的继承性使所建立的软件具有开放性、可扩充性,这是信息组织与分类的行之有效的方法,它简化了对象、类的创建工作量,增加了代码的可重用性,采用继承性,提供了类的规范的等级结构。通过类的继承关系,使公共的特性能够共享,提高了软件的重用性。多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,多态性允许每个对象以适合自身的方式去响应共同的消息,同时也增强了软件的灵活性和重用性。3.面向对象在Ruby中的分析在Ruby中,对面向对象的支持包括:Ruby类定义C+和Java等语言不同,因为它们是可执行的。这允许它们在执行期间保持开放性。程序可以在类中任意多次的添加类成员。在执行期间,类的现有定义就是已经执行的类的所有定义的联合。方法定义也是可执行,这允许程序在执行期间,通过把两个方法定义放入选择结构的then和else子句来选择一个方法定义。Ruby里所有的变量都是对象的引用,而且都是无类型的。所有实例变量名都已符号开头。Ruby与其他常用编程语言的的明显区别是,Ruby的访问控制在访问数据和访问方法上不同。所有实例数据都默认为私有访问,且不能改变。如果需要对实例变量进行外部访问,就必须定义访问方法。例如下面的类定义框架:Class MyClass# A constructor Def initialize one = 1 two = 2 End# A getter for one Def one one End# A setter for one Def one=(my_one) one = my_one End End # of class MyClass 与设置方法名相连的等号(=)表明他的变量是可复制的。因此,所有设置方法名都有相连的等号。One获取方法体说明了用Ruby设计的方法没有返回语句时,就返回已求值的最后一个表示式的值。本例是返回one的值。由于需要经常使用获取和设置方法,Ruby提供了它们的快捷方法。例如类有两个实例变量的获取方法one和two,那么这些获取方法就可以在类中用一个语句指定:Attr_reader :one, :twoAttr_reader实际上是用:one和:two作为实参的函数调用。在变量前加冒号(:)表示要使用变量名,而不是取消其引用对象的引用。用类似方式创建设置方法的函数称为attr_writer。这个函数与attr_reader具有相同的参数列表。创建获取方法和设置方法的函数都指定了名称,因为它们提供了类对象的协议,这称为属性。类的属性定义了类对象的数据接口。Ruby对象用new创建,new隐式调用了构造函数。Ruby类中的常用构造函数命名为initialize。子类的构造函数可以初始化定义了设置方法的父类数据成员。这一过程是通过调用super,并以初始值作为实参来实现的。Super会调用父类的方法,这个方法与调用super时使用的方法同名。类变量通过在名称前加两个符号()来指定,他们对类和其实例是私有化的。这种私有性不能改变。另外,与全局变量和实例变量不同,类变量必须在使用前初始化。继承:在Ruby中定义子类采用小于号(),例如:Class MySubClass BaseClassRuby的方法访问控制有一个显著的不同,那就是只能调用访问控制函数,就能在子类中改变它们。这意味着可以定义基类的两个子类,使一个子类的对象可以访问基类定义的方法,但是另一个子类的对象不能。这也允许改变基类中公有方法对子类私有方法的访问,这种子类明显不能是子类型。Ruby模块提供了一种命名封装,它常常用于定义函数库。在类中访问模块include语句来指定。例如:Include Math包含模块的效果是类获得指向模块的指针,并有效地继承定义在模块中的函数。实际上,类包含模块时,模块就变成了类的一个代理超类。这样的模块称为混合类型(minin)。动态绑定:变量不能类型化,但它们是对任何类对象的引用。因此,所有变量是多态的,并且所有多方法调用的绑定都是动态的。4.面向对象在Ruby中的实现 接下来我们在Ruby的交互界面irb上进行Ruby面向对象各个实例的分析。4.1 Ruby 类定义 当我们定义了一个类时,实际是定义了一个数据类型的蓝图。这实际上并没有定义任何的数据,而是定义了类的名称意味着什么,也就是说,定义了类的对象将由什么组成,以及在该对象上能执行什么操作。类定义以关键字class开始,后跟类名称,最后以一个end进行分隔表示终止该类定义。例如,我们使用关键字 class 来定义 Box 类,如下所示:4.2定义 Ruby 对象 类提供了对象的蓝图,所以基本上,对象是根据类进行创建的。我们使用new关键字声明类的对象。下面的语句声明了类 Box 的两个对象:4.3 initialize 方法 initialize方法是一个标准的 Ruby 类方法,与其他面向对象编程语言中的constructor工作原理类似。当我们想要在创建对象的同时初始化一些类变量,initialize 方法就派上用场了。该方法带有一系列参数,与其他 Ruby 方法一样,使用该方法时,必须在前面放置def关键字,如下所示:4.4实例变量 实例变量是类属性,它们在使用类创建对象时就变成对象的属性。每个对象的属性是单独赋值的,和其他对象之间不共享值。在类的内部,是使用 运算符访问这些属性,在类的外部,则是使用称为访问器方法的公共方法进行访问。下面我们以上面定义的类Box为实例,把 width 和 height 作为类 Box 的实例变量。4.5 访问器 & 设置器 方法 为了在类的外部使用变量,我们必须在访问器方法内部定义这些变量,这些访问器方法也被称为获取器方法。下面的实例演示了访问器方法的用法:4.6实例方法 实例方法的定义与其他方法的定义一样,都是使用def关键字,但它们只能通过类实例来使用,如下面实例所示。它们的功能不限于访问实例变量,也能按照我们的需求做更多其他的任务。4.7类方法 & 类变量 类变量是在类的所有实例中共享的变量。换句话说,类变量的实例可以被所有的对象实例访问。类变量以两个 字符()作为前缀,类变量必须在类定义中被初始化,如下面实例所示。类方法使用def self.methodname()定义,类方法以 end 分隔符结尾。类方法可使用带有类名称的classname.methodname形式调用,如下面实例所示:4.8 to_s 方法我们定义的任何类都有一个to_s实例方法来返回对象的字符串表示形式。下面是一个简单的实例,根据 width 和 height 表示 Box 对象:4.9 访问控制 Ruby 提供了三个级别的实例方法保护,分别是public、private 或 protected。Ruby 不在实例和类变量上应用任何访问控制。 Public 方法:Public 方法可被任意对象调用。默认情况下,方法都是 public 的,除了 initialize 方法总是 private 的。 Private 方法:Private 方法不能从类外部访问或查看。只有类方法可以访问私有成员。 Protected 方法:Protected 方法只能被类及其子类的对象调用。访问也只能在类及其子类内部进行。 下面是一个简单的实例,演示了这三种修饰符的语法:当上面的代码执行时,它会产生以下结果。在这里,第一种方法调用成功,但是第二方法会产生一个问题。4.10类的继承 继承,是面向对象编程中最重要的概念之一。继承允许我们根据另一个类定义一个类,这样使得创建和维护应用程序变得更加容易。 继承有助于重用代码和快速执行,不幸的是,Ruby 不支持多继承,但是 Ruby 支持mixins。mixin 就像是多继承的一个特定实现,在多继承中,只有接口部分是可继承的。 当创建类时,程序员可以直接指定新类继承自某个已有类的成员,这样就不用从头编写新的数据成员和成员函数。这个已有类被称为基类或父类,新类被称为派生类或子类。 Ruby 也提供了子类化的概念,子类化即继承,下面的实例解释了这个概念。扩展一个类的语法非常简单。只要添加一个 字符和父类的名称到类语句中即可。例如,下面定义了类BigBox是Box的子类:4.12 方法重载 虽然我们可以在派生类中添加新的功能,但有时可能想要改变已经在父类中定义的方法的行为。这时可以保持方法名称不变,重载方法的功能即可,如下面实例所示:4.13 运算符重载 我们希望使用 + 运算符执行两个 Box 对象的向量加法,使用 * 运算符来把 Box 的 width 和 height 相乘,使用一元运算符 - 对 Box 的 width 和 height 求反。下面是一个带有数学运算符定义的 Box 类版本:4.14 冻结对象 有时候,我们想要防止对象被改变。在 Object 中,freeze 方法可实现这点,它能有效地把一个对象变成一个常量。任何对象都可以通过调用Object.freeze进行冻结。冻结对象不能被修改。可以使用Object.frozen?方法检查一个给定的对象是否已经被冻结。如果对象已被冻结,该方法将返回 true,否则返回一个 false 值。下面的实例解释了这个概念:4.15 类常量 可以在类的内部定义一个常量,通过把一个直接的数值或字符串值赋给一个变量来定义的,常量的定义不需要使用 或 。按照惯例,常量的名称使用大写。一旦常量被定义,我们就不能改变它的值,可以在类的内部直接访问常量,就像是访问变量一样,但是如果想要在类的外部访问常量,那么我们就必须使用classname:constant,如下面实例所示。4.16 使用 allocate 创建对象 可能有一种情况,当我们想

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论