18.2 面向?qū)ο蟮能浖_發(fā)中的重要概念
在第四章中我已經(jīng)簡單的介紹了什么是面向?qū)ο蟮能浖_發(fā),你應(yīng)該還記得那個以“人”作為對象的例子,以及當(dāng)路遇惡狗而被惡狗攆這一事件發(fā)生時,他可以調(diào)用“撒腿就跑”這個方法來作為對這個事件的響應(yīng)。 但不管怎么說,我不想因?yàn)檫@些例子而使你輕視了面向?qū)ο蟮能浖_發(fā)。事實(shí)上,面向?qū)ο蠛x深遠(yuǎn),涉及許多重要的概念,只有充分理解了這些概念的含義,你才算真正理解了什么叫面向?qū)ο蟆:芏喔拍钅愣紤?yīng)該知道,但限于篇幅,本節(jié)中我將講解其中最重要的九個。 面向?qū)ο蟮能浖_發(fā)中九個最基本的概念:類、對象、屬性、方法、抽象、封裝、繼承、多態(tài),以及事件。
18.2.1 類和對象
類是對象的軟件抽象,是創(chuàng)建對象的模板。例如,如果一個人被看作一個對象的話,則人這個物種就可以被看作一個類。類定義描述了包括數(shù)據(jù)和功能在內(nèi)的結(jié)構(gòu),對象由其創(chuàng)建。一個類表示一組相似的對象。對象是類的實(shí)例。
為什么需要類,想象這樣一個情況,假如我們要編寫一個Flash游戲,里面要有一些能自主活動的小人,這些小人都有相同的體貌特征和活動能力,那么,若我們要為每個小人編寫程序的話,則工作量毫無疑問是巨大和重復(fù)的。在這種情況下,我們就應(yīng)該創(chuàng)建一個“小人”類,以后每當(dāng)需要一個新的小人時就從“小人”類生成一個小人即可。
話說到這里,你一定想到了元件和實(shí)例的關(guān)系。沒錯,類和對象的關(guān)系與元件和實(shí)例的關(guān)系一樣,因?yàn)樵䦟?shí)際上就是Flash的內(nèi)建類。
18.2.2 屬性和方法
屬性是數(shù)據(jù),而方法是函數(shù)。屬性是類知道的事情,而方法是類完成的事情。屬性和方法都是類的職責(zé)。面向?qū)ο蟮能浖_發(fā)是基于這樣的概念:系統(tǒng)應(yīng)由對象來創(chuàng)建,對象擁有數(shù)據(jù)和功能。屬性定義數(shù)據(jù),而方法定義功能。
顯然,在面向?qū)ο蟮拈_發(fā)中,最重要的工作就是定義類。而定義類時,就必須定義它的屬性和方法。屬性的定義應(yīng)該是直接明了的,需要定義它的名稱和數(shù)據(jù)類型。方法的定義就是創(chuàng)建一個函數(shù)的過程,根據(jù)需要,你可以創(chuàng)建出能夠接受參數(shù)且能夠返回值的方法。
18.2.3 抽象
世界非常復(fù)雜,為了處理它的復(fù)雜性,在軟件設(shè)計(jì)中,當(dāng)需要對事物建立數(shù)學(xué)模型時,我們有必要對事物進(jìn)行泛化或抽象。還是以人作為對象,從招聘的角度看,我們需要知道這個人的姓名、性別、年齡、教育背景、工作經(jīng)歷,聯(lián)系方式,以及性格特點(diǎn);而從相親的角度看,則需要知道這個人的年齡、身高、外貌、教育背景、家庭背景,甚至生辰八字。還是同一個人,只是對他(或她)進(jìn)行了不同的抽象而已,對一個事物進(jìn)行怎樣的抽象將依據(jù)你要設(shè)計(jì)的程序而定。
抽象是個分析的過程,是在事物周圍繪制出一個清晰的框架的過程。抽象應(yīng)該包含應(yīng)用程序感興趣的功能、屬性、方法,而將其他因素忽略。這就是為什么招聘的抽象包含教育背景和工作經(jīng)歷,但不會包含生辰八字的原因。抽象的過程,就是定義類知道和要完成的事情的過程。
18.2.4 封裝
盡管抽象告訴我們,對于招聘,我們應(yīng)該存儲應(yīng)聘者的教育背景和工作經(jīng)歷,但它沒有告訴我們該怎樣完成這些事情。封裝解決了如何為系統(tǒng)功能建模的問題。在面向?qū)ο蟮氖澜缰,我們要把系統(tǒng)建模成類,類也要建模為屬性和方法。設(shè)計(jì)類將如何完成這些事情的過程就被稱為封裝。
封裝描述了如何在系統(tǒng)中劃分功能的問題。我們并不需要知道對象內(nèi)部是怎樣實(shí)現(xiàn)的。封裝暗示著我們能夠以任何方式構(gòu)建系統(tǒng),如果需要的話,還可以在日后再次修改其內(nèi)部的結(jié)構(gòu),只要系統(tǒng)中不同功能組件之間的接口沒有發(fā)生變化,那么對系統(tǒng)中一個功能部分的改變不會對系統(tǒng)的其他功能部分產(chǎn)生影響。
封裝是把事物周圍的那個框架涂黑的過程。你可以定義任何想要定義的東西,但你并不需要告知外界你的做法。例如,當(dāng)你到銀行存取現(xiàn)金的時候,你并不需要知道銀行的數(shù)據(jù)中心是如何使用大型機(jī)、小型機(jī)和PC機(jī)來記錄你的賬戶信息的,它們使用著怎樣的數(shù)據(jù)庫和操作系統(tǒng),也根本無關(guān)緊要,因?yàn)樗鼈円呀?jīng)把賬戶服務(wù)的功能封裝起來了。你只需走到柜臺前,把存折遞給銀行的工作人員既可。通過隱藏起實(shí)現(xiàn)賬戶功能的細(xì)節(jié),銀行能夠在任何時候自由改變功能實(shí)現(xiàn),而不用費(fèi)事得更換每一個用戶的存折。
為了讓應(yīng)用程序容易維護(hù)和增加安全性及健壯性,需要限制對類的屬性和方法的訪問;舅枷肴缦拢喝绻粋類想獲取另一個類的信息,必需先征得同意,而不是直接拿來就用?紤]一下,在現(xiàn)實(shí)世界中其實(shí)也是按照這種方法工作的。如果你想了解其他人的姓名,你該怎么做?是直接詢問這個人他的姓名呢,還是偷走他的錢包看看他的身份證呢?
18.2.5 繼承
不同的類之間經(jīng)常會存在相似性。兩個以上的類也會經(jīng)常共享相同的屬性和/或相同的方法。因?yàn)槲覀儾⒉幌胫貜?fù)編寫代碼,因此我們就要利用這種相似機(jī)制。繼承就是這種機(jī)制,它使你可以很容易的重用現(xiàn)有的數(shù)據(jù)和代碼。
例如,學(xué)生都有姓名、地址、手機(jī),也都能快跑。同時,老師也都有這些東西。毫無疑問,我們可以開發(fā)有關(guān)學(xué)生和老師的類,讓它們一起運(yùn)行。實(shí)際上,僅需要先開發(fā)Student類,一旦它運(yùn)行起來了,制作一份拷貝,就叫Teacher類,并對其進(jìn)行一些適當(dāng)?shù)男薷募纯。這樣做很容易,但并不完美。如果Student類中的源代碼出現(xiàn)錯誤將會怎樣?你將不得不在兩個地方改正錯誤。這將是索然無趣的工作。如果僅有一份代碼拷貝用于開發(fā)和維護(hù),這樣不是更好嗎?
這就是繼承的思想。使用繼承,就可以定義一個類來封裝學(xué)生和老師之間的相似性。新的類將有屬性name、address、mobileTelephone,以及方法run。我們可以把這個類命名為Person。
一旦定義了Person類,就可以從它繼承出Student和Teacher類。我們稱Person是Student和Teacher類的超類,而Student和Teacher類則是Person類的子類。任何超類知道和完成的事情,子類也知道。因此,既然Person類遇到惡狗時能撒腿就跑,Student和Teacher類也能。
18.2.6 多態(tài)
讓我們考慮一下這個例子。你很愛你的女友,你對她說“親愛的,我愛你”,你的女友熱情的擁抱你,你還得到了一個吻,你覺得這很不錯。然后,你來到了大街上,看到一位很有氣質(zhì)的美女,你也用跟女友打招呼的方式對這位美女說“親愛的,我愛你”,你將立刻得到有關(guān)你的神經(jīng)和品德方面的一些建議。隨后,你又來到醫(yī)院,對一老中醫(yī)說“親愛的,我愛你”,老中醫(yī)將毫不猶豫的拉過你的手腕,開始為你把脈。你心想,無論何時當(dāng)我遭遇這些對象并說“親愛的,我愛你”時,這種情況肯定就會發(fā)生—這就是多態(tài)。
多態(tài)使得對象可以在事先不知道其他對象的類型時就與其他對象協(xié)作。 從這次經(jīng)歷中你可以學(xué)到幾個有意思的經(jīng)驗(yàn):
第一,多態(tài)阻礙了你與其他對象之間的交互。你并不區(qū)別其他對象的類型,你以同樣的方式對待他們。你的想法是其他對象都是人。多態(tài)是允許這種情況發(fā)生的一個概念。
第二,不同的對象以他們自己的方式作出不同的響應(yīng)。你的女友擁抱你并給你吻;陌生的美女給你有關(guān)神經(jīng)和品德方面的建議;而老中醫(yī)則給你把脈。同一消息到達(dá)不同的對象,每一個完成的事情都是不同的。實(shí)際上,從各個對象的角度看,他們做了應(yīng)該做的事情。
第三,多態(tài)可以實(shí)現(xiàn)一致而恰當(dāng)?shù)姆椒。盡管每種對象都以適當(dāng)?shù)姆绞巾憫?yīng)了“親愛的,我愛你”,但還是要實(shí)現(xiàn)方法的不同版本。
多態(tài)性主要包括兩個方面: 運(yùn)算符的重載:同一運(yùn)算符可以作用在多種對象類型上。 函數(shù)名重載:相同的函數(shù)名可以作用在不同的對象類型上,并產(chǎn)生不同的效果。
18.2.7 事件
面向?qū)ο蟮能浖倪\(yùn)行是隨著一個個事件的發(fā)生來進(jìn)行的,這被稱為“事件驅(qū)動”。例如,當(dāng)你欣賞Flash動畫時,實(shí)際上是正在發(fā)生一個個“進(jìn)入幀”事件,在這些事件中,F(xiàn)lash Player會呈遞每幀中的內(nèi)容,所以你就能看到畫面。
同樣的,當(dāng)你點(diǎn)擊按鈕時,一個按鈕事件就發(fā)生了,該按鈕事件中的腳本就被執(zhí)行,這些腳本的作用可能是把你帶到特定的場景、特定的幀,或是鏈接到某個URL。
在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,整個軟件都是以事件驅(qū)動的,這意味著假如沒有任何事件發(fā)生,你的程序?qū)⒋绮诫y行,不過好在程序中總是有某些事情發(fā)生的,即使所有其他的事件都不發(fā)生,也會有時間流逝這一事件在時刻發(fā)生著。
在本書后面章中的實(shí)際開發(fā)中,你將看到上述所有這些面向?qū)ο蟮母拍畹膶?shí)際運(yùn)用。
出處:藍(lán)色理想
責(zé)任編輯:qhwa
上一頁 像軟件設(shè)計(jì)師那樣思考問題 下一頁 好的編程風(fēng)格
◎進(jìn)入論壇Flash專欄版塊參加討論
|