本章節(jié)我們來了解 Ruby 面向?qū)ο蠓矫嬷R(shí),了解類與實(shí)例的基本概念
面向?qū)ο蟪绦蛟O(shè)計(jì)(英語:Object-oriented programming,縮寫:OOP)是種具有對(duì)象概念的程序編程典范,同時(shí)也是一種程序開發(fā)的抽象方針。它可能包含數(shù)據(jù)、屬性、代碼與方法。對(duì)象則指的是類的實(shí)例。它將對(duì)象作為程序的基本單元,將程序和數(shù)據(jù)封裝其中,以提高軟件的重用性、靈活性和擴(kuò)展性,對(duì)象里的程序可以訪問及經(jīng)常修改對(duì)象相關(guān)聯(lián)的數(shù)據(jù)。在面向?qū)ο蟪绦蚓幊汤?,?jì)算機(jī)程序會(huì)被設(shè)計(jì)成彼此相關(guān)的對(duì)象?!俜蕉x
面向?qū)ο蟪绦蛟O(shè)計(jì)(英語:Object-oriented programming,縮寫:OOP)是種具有對(duì)象概念的程序編程典范,同時(shí)也是一種程序開發(fā)的抽象方針。它可能包含數(shù)據(jù)、屬性、代碼與方法。對(duì)象則指的是類的實(shí)例。它將對(duì)象作為程序的基本單元,將程序和數(shù)據(jù)封裝其中,以提高軟件的重用性、靈活性和擴(kuò)展性,對(duì)象里的程序可以訪問及經(jīng)常修改對(duì)象相關(guān)聯(lián)的數(shù)據(jù)。在面向?qū)ο蟪绦蚓幊汤?,?jì)算機(jī)程序會(huì)被設(shè)計(jì)成彼此相關(guān)的對(duì)象?!俜蕉x
通俗來講,面向?qū)ο蟮念惡帽仁且粡埧照{(diào)的設(shè)計(jì)圖,是抽象的,而具體的一個(gè)空調(diào)則是這個(gè)類的實(shí)例,也稱為對(duì)象??照{(diào)的實(shí)例擁有著空調(diào)這個(gè)類賦予的屬性,比如:顏色、功率、長度與寬度,并且也擁有類給予的方法,比如:制冷制熱、上下掃風(fēng)等。
Ruby是一種真正意義上的面向?qū)ο笳Z言(Object-Oriented Language,簡(jiǎn)稱:OO Language),您所操縱的一切都是對(duì)象,而這些操縱的結(jié)果本身也是對(duì)象。
所有面向?qū)ο蠖加邢嗤闹鲝?,但是基于一些語言特性,它們對(duì)面向?qū)ο蟮暮x通常有不同的解釋,并對(duì)其所采用的概念使用不同的術(shù)語。
因此,在我們深入細(xì)節(jié)之前,讓我們簡(jiǎn)要地看一下將要使用的術(shù)語和符號(hào)。
1. Ruby 的面向?qū)ο?/h2>
在編寫面向?qū)ο蟮拇a時(shí),通常希望在代碼中模擬現(xiàn)實(shí)世界中的概念。通常,在此建模過程中,您會(huì)發(fā)現(xiàn)需要用代碼表示的事物的類別。在音樂播放器中,"歌曲"的概念可能就是這種類別。在Ruby中,您將定義一個(gè)類來表示每個(gè)實(shí)體。類是狀態(tài)(例如,歌曲的名稱)和使用該狀態(tài)的方法(也許是播放歌曲的方法)的組合。
一旦有了這些類,通常將需要為每個(gè)類創(chuàng)建許多實(shí)例。對(duì)于包含名為 Song 的類的音樂播放器系統(tǒng),您將擁有單獨(dú)的流行歌曲實(shí)例,例如"Ruby Tuesday"
,"Enveloped in Python"
,"String of Pearls"
,"Small talk"
等等。
1.1 創(chuàng)建一個(gè)對(duì)象
Tips:對(duì)象(object)一詞可與類實(shí)例(class instance)互換使用,我們會(huì)更多地使用對(duì)象這個(gè)詞。
在 Ruby 中,這些對(duì)象是通過調(diào)用構(gòu)造函數(shù)(constructor,與類關(guān)聯(lián)的特殊方法)創(chuàng)建的。標(biāo)準(zhǔn)構(gòu)造函數(shù)稱new
。
song1 = Song.new("Ruby Tuesday")
song2 = Song.new("Enveloped in Python")
song3 = Song.new("String of Pearls")
# 等等
1.2 對(duì)象的屬性
上述的實(shí)例都源自同一類,但是它們都具有獨(dú)特的特征。首先,每個(gè)對(duì)象都有一個(gè)唯一的對(duì)象標(biāo)識(shí)符(object identifier,簡(jiǎn)稱為對(duì)象 ID),其次,您可以定義實(shí)例變量(instance variables),即每個(gè)實(shí)例具有唯一值的變量。
這些實(shí)例變量保存對(duì)象的狀態(tài)。例如:我們的每首歌曲都可能有一個(gè)實(shí)例變量來保存歌曲的標(biāo)題(實(shí)例變量我們會(huì)在Ruby的變量章節(jié)為您講解)。
在上述的例子中,第一首歌的標(biāo)題為 “Ruby Tuesday”,第二首歌的標(biāo)題為 “Enveloped in Python”,第三首歌的標(biāo)題是 “String of Pearls”。
1.3 對(duì)象的功能
在每個(gè)類中,您可以定義實(shí)例方法(instance methods)。每個(gè)方法都是功能的一部分,可以從類內(nèi)部調(diào)用(取決于訪問約束)。這些實(shí)例方法又可以訪問對(duì)象的實(shí)例變量,從而可以訪問對(duì)象的狀態(tài)。
對(duì)象通過發(fā)送消息來調(diào)用方法,該消息包含方法的名稱以及該方法所需要的任何參數(shù),當(dāng)對(duì)象接收到消息時(shí),他會(huì)在自己的類中查找對(duì)應(yīng)的方法,如果找到則執(zhí)行該方法。
聽起來雖然很復(fù)雜,但是實(shí)際使用起來很自然,下面是一些方法的調(diào)用(示例中箭頭顯示表達(dá)式返回的值)
實(shí)例:
"gin joint".length ? 9
"Rick".index("c") ? 2
-1942.abs ? 1942
sam.play(aSong) ? "duh dum, da dum de dum ..."
解釋:
-
所有點(diǎn)之前的內(nèi)容成為接收者,點(diǎn)之后的成為要調(diào)用的方法;
-
第一個(gè)示例詢問一個(gè)字符串的長度;
-
第二個(gè)示例詢問一個(gè)字符串其字母’c’的索引;
-
第三個(gè)示例計(jì)算一個(gè)數(shù)字的絕對(duì)值;
-
最后一個(gè),請(qǐng)sam給大家播放一首歌。
1.4 與其他語言對(duì)比
在 Java 中,您需要調(diào)用一個(gè)單獨(dú)的函數(shù)并傳入該數(shù)字來找到某個(gè)數(shù)字的絕對(duì)值,您可能會(huì)寫:
number = Math.abs(number) // Java code
而 Ruby,獲得絕對(duì)值的能力內(nèi)置于數(shù)字中,它們內(nèi)部會(huì)將細(xì)節(jié)進(jìn)行處理,您只需要將abs
的消息發(fā)送給一個(gè)數(shù)字對(duì)象,然后讓它完成工作即可。
number = number.abs
這同樣適用于所有 Ruby 對(duì)象,比如說,獲取一個(gè)字符串長度,在 C 語言中,您會(huì)使用strlen(name)
,而在 Ruby 里,它是name.length
,以此類推。因此,Ruby 是一種真正的 OO Language。
2. 小結(jié)
本章中為大家講解了面向?qū)ο蟮母拍钜约霸?Ruby 中跟面向?qū)ο笥嘘P(guān)的一些術(shù)語,對(duì)于之前沒有面向?qū)ο蠡A(chǔ)的同學(xué)理解上多少會(huì)有點(diǎn)難度,暫時(shí)不太理解也不要灰心,在后面的學(xué)習(xí)中我也會(huì)不斷強(qiáng)調(diào)面向?qū)ο蟮母拍睿欢ㄒ粩嗨伎寂丁?/p>