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