1. 程式人生 > Ruby 程式語言入門 >05 Ruby 的面向物件

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 中跟面向物件有關的一些術語,對於之前沒有面向物件基礎的同學理解上多少會有點難度,暫時不太理解也不要灰心,在後面的學習中我也會不斷強調面向物件的概念,一定要不斷思考哦。