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 中跟面向对象有关的一些术语,对于之前没有面向对象基础的同学理解上多少会有点难度,暂时不太理解也不要灰心,在后面的学习中我也会不断强调面向对象的概念,一定要不断思考哦。