05 Ruby 的面向对象
本章节我们来了解 Ruby 面向对象方面知识,了解类与实例的基本概念
1. 什么是面向对象
面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是种具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。它可能包含数据、属性、代码与方法。对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关联的数据。在面向对象程序编程里,计算机程序会被设计成彼此相关的对象。——官方定义
通俗来讲,面向对象的类好比是一张空调的设计图,是抽象的,而具体的一个空调则是这个类的实例,也称为对象。空调的实例拥有着空调这个类赋予的属性,比如:颜色、功率、长度与宽度,并且也拥有类给予的方法,比如:制冷制热、上下扫风等。
Ruby是一种真正意义上的面向对象语言(Object-Oriented Language,简称:OO Language),您所操纵的一切都是对象,而这些操纵的结果本身也是对象。
所有面向对象都有相同的主张,但是基于一些语言特性,它们对面向对象的含义通常有不同的解释,并对其所采用的概念使用不同的术语。
因此,在我们深入细节之前,让我们简要地看一下将要使用的术语和符号。
1. Ruby 的面向对象
在编写面向对象的代码时,通常希望在代码中模拟现实世界中的概念。通常,在此建模过程中,您会发现需要用代码表示的事物的类别。在音乐播放器中,"歌曲"的概念可能就是这种类别。在Ruby中,您将定义一个类来表示每个实体。类是状态(例如,歌曲的名称)和使用该状态的方法(也许是播放歌曲的方法)的组合。
一旦有了这些类,通常将需要为每个类创建许多实例。对于包含名为 Song 的类的音乐播放器系统,您将拥有单独的流行歌曲实例,例如"Ruby Tuesday"
,"Enveloped in Python"
,"String of Pearls"
,"Small talk"
等等。
1.1 创建一个对象
Tips:对象(object)一词可与类实例(class instance)互换使用,我们会更多地使用对象这个词。
在 Ruby 中,这些对象是通过调用构造函数(constructor,与类关联的特殊方法)创建的。标准构造函数称new
。
song1 = Song.new("Ruby Tuesday")
song2 = Song.new("Enveloped in Python")
song3 = Song.new("String of Pearls")
# 等等
1.2 对象的属性
上述的实例都源自同一类,但是它们都具有独特的特征。首先,每个对象都有一个唯一的对象标识符(object identifier,简称为对象 ID),其次,您可以定义实例变量(instance variables),即每个实例具有唯一值的变量。
这些实例变量保存对象的状态。例如:我们的每首歌曲都可能有一个实例变量来保存歌曲的标题(实例变量我们会在Ruby的变量章节为您讲解)。
在上述的例子中,第一首歌的标题为 “Ruby Tuesday”,第二首歌的标题为 “Enveloped in Python”,第三首歌的标题是 “String of Pearls”。
1.3 对象的功能
在每个类中,您可以定义实例方法(instance methods)。每个方法都是功能的一部分,可以从类内部调用(取决于访问约束)。这些实例方法又可以访问对象的实例变量,从而可以访问对象的状态。
对象通过发送消息来调用方法,该消息包含方法的名称以及该方法所需要的任何参数,当对象接收到消息时,他会在自己的类中查找对应的方法,如果找到则执行该方法。
听起来虽然很复杂,但是实际使用起来很自然,下面是一些方法的调用(示例中箭头显示表达式返回的值)
实例:
"gin joint".length » 9
"Rick".index("c") » 2
-1942.abs » 1942
sam.play(aSong) » "duh dum, da dum de dum ..."
解释:
所有点之前的内容成为接收者,点之后的成为要调用的方法;
第一个示例询问一个字符串的长度;
第二个示例询问一个字符串其字母’c’的索引;
第三个示例计算一个数字的绝对值;
最后一个,请sam给大家播放一首歌。
1.4 与其他语言对比
在 Java 中,您需要调用一个单独的函数并传入该数字来找到某个数字的绝对值,您可能会写:
number = Math.abs(number) // Java code
而 Ruby,获得绝对值的能力内置于数字中,它们内部会将细节进行处理,您只需要将abs
的消息发送给一个数字对象,然后让它完成工作即可。
number = number.abs
这同样适用于所有 Ruby 对象,比如说,获取一个字符串长度,在 C 语言中,您会使用strlen(name)
,而在 Ruby 里,它是name.length
,以此类推。因此,Ruby 是一种真正的 OO Language。
2. 小结
本章中为大家讲解了面向对象的概念以及在 Ruby 中跟面向对象有关的一些术语,对于之前没有面向对象基础的同学理解上多少会有点难度,暂时不太理解也不要灰心,在后面的学习中我也会不断强调面向对象的概念,一定要不断思考哦。