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