二、C#與面向對象程式設計語言
C#是純粹的面向對象程式設計語言,它真正展現了“一切皆為對象”的精神。在C#中,即使是最基本的資料類型,如int,double,bool類型,都屬于System.Object類型。此外,使用C#程式設計,不會存在與遊離于對象之外的屬于過程的東西。是以,學習C#,就必須具有面向對象思想,不明白所謂的“面向對象思想”,就不可能掌握C#的精髓,而對于C#的了解,就隻能僅限于語言特色的表面了。
很多講解面向對象思想的書籍和文章喜歡将面向對象與面向過程相比較,然而對于學習程式設計的初學者而言,是完全沒有必要的。一張空白的紙張,事實上比寫滿字的紙張更利于未來的發展。
那麼什麼是“面向對象思想”?其精要當然是“一切皆為對象”的意義。軟體的開發與設計,是圍繞着開發的目标進行的。比如開發一個電子商務網站,那麼與電子商務有關的都是我們要操作和關心的,商品、訂單、使用者、目錄、購物車等等,都是對象。如果要開發一個論壇,那麼論壇中必備的要素,如論壇分類、主題、文章、評論、使用者,也全都是對象。從小處說,我們要求寫一個算法用以計算階乘,那麼起始值、運算結果、以及整個算法都是對象。
那麼對象具有什麼特質?一般而言,一個對象應具有屬性和行為。以現實世界為例,“人”作為一種特殊的動物,也是我們所稱謂的“對象”。這個對象具有很多屬性,例如姓名,身高、體重、民族、國籍、出生年月等等。而行為呢,可以是行走、吃飯、跑步、乃至于玩遊戲、踢足球。如果從詞義學的角度來看,屬性更偏向于名詞的範疇,而行為則近乎于動詞。然而對象也有特殊的情況,或者隻具有屬性,或者隻具有行為。例如身份證,可能隻具有姓名,出生年月,籍貫,身份證号等屬性,而沒有行為。例如“飛”,這本身是一種動作,但同樣可以認為是一種行為。
然而這種劃分并非絕對,根據實際情況,同一種對象具有的屬性和行為可能不一樣。例如同樣是“人”,如果是要開發一個戶籍管理系統,我們就不必去考慮行走、吃飯、跑步等行為,但如果是一個足球遊戲,那麼對象“人”,就需要各種踢足球的動作作為該對象的行為了。再比如“身份證”對象,也可能為了使用友善,會為它添加“IsValidate”這樣一個行為。
還要注意的是,很多時候屬性其實本身也是一個對象,例如姓名,可以是string類型,它屬于Sytem.Object對象類型,我們也可以單獨為姓名建立一個類對象:
public class Name
{
public string FirstName;
public string MiddleName;
public string LastName;
}
在C#裡,有各種各樣的對象類型,除了本身提供的基本類型外,還支援自定義各種類型,包括class,struct,enum,interface,delegate,event。以前面的例子來看,對象Person“人”,就可以被定義為class類型,國籍可以被定義為enum類型。沒有行為的身份證,也可以被定義為struct類型。動作“飛”可以被定義為interface類型。至于delegate和event,則是一種特殊對象類型,例如我們可以為論壇管理系統,定義一系列事件,如BeforePost,AfterPost等等。關于這些内容,我會在後面的内容中詳細講解。
要掌握面向對象思想,就必須具備識别系統中對象的能力。在我們要開發的系統中,哪些需要定義為單獨的對象,而且這個對象應該具備哪些屬性和行為,都是初學者比較頭疼的問題。要正确地識别對象,就需要首先分析該系統所應實作的功能。例如,我們要求開發一個電子商務系統,功能要求如下:
1、支援商品的查詢功能;
2、使用者如需購買商品,需要成為注冊使用者并登入;
3、如果目前庫存無該商品,使用者可以預訂;
4、使用者可以将商品放入購物車;
5、使用者購買商品之前,需送出訂單;
6、使用者送出訂單後,系統應将訂購資訊發送郵件給使用者;
7、使用者可以對商品添加評論。
有一個簡單的方法,可以幫助我們識别對象,就是找出這些功能描述中的關鍵名詞,如商品、使用者、購物車、訂單、評論。這些詞語基本上可以涵蓋這個電子商務系統的主要對象了。至于對象的屬性,可以考察該系統對這個對象的要求和所需要的資訊。例如商品,必然要求有商品名、價格、相關圖檔、所屬類别、庫存量等等。至于行為,我們還可以從功能描述中去尋找與這些對象名詞相關聯的動詞。例如商品的查詢,就代表商品具有Search行為。使用者注冊與登入,就代表該使用者具有這兩種行為:Register,SignIn。當然隐含的行為自然還包括SignOut。
真正要識别好對象,也許我們需要掌握UML的知識,知道怎麼寫用例。或者利用極限程式設計的方法,把一個個使用者故事寫出來,然後一一識别。不過這些知識對于初學者似乎太難了。我們現在知道能有這樣一個方法就可以了。我更希望的是,讀者在看完本節,能夠建立起“一切皆為對象”的思想。最後,更希望大家能把識别對象看作是一種填字遊戲,關鍵不在于答案是什麼,樂趣全在遊戲中了。
面向對象思想博大精深,不是三言兩語就能說清楚的。但建立這樣一種思想,要存乎于你的内心,這在與一種“妙悟”。也許在你寫了幾百個小程式之後還沒能體會到面向對象的真谛,但是在霎那之間,你卻突然明白了,頓有一種撥開雲開見月明的喜悅。我不是故意賣弄玄虛,有時候開發軟體還真需要那麼一點靈感,有人說,程式設計是一門藝術,我同意。那麼這種“妙悟”什麼時候能來到,我無法确知答案,這需要你的體悟。不過這種體悟與談禅無關,不是每天冥想就可以的,還是踏實點,多寫寫程式,慢慢你就會明白了。