第3章.面向對象設計基礎_第1頁
第3章.面向對象設計基礎_第2頁
第3章.面向對象設計基礎_第3頁
第3章.面向對象設計基礎_第4頁
第3章.面向對象設計基礎_第5頁
已閱讀5頁,還剩35頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第3章 面向對象設計基礎第二章介紹了C#的基本語法,以及使用方法。C#同Java、C+一樣是面向對象的編程語言,同時C#更強化了面向對象的概念。本章將介紹面向對象的基礎知識并介紹使用C#編寫面向對象的應用程序,在C#中,面向對象的開發能夠給系統設計、編碼、維護提供更多的便利。3.1 什么是面向對象面向對象是應用程序開發中一個非常重要的技巧和概念,面向對象并不是什么高深的技術也不是負責的學習體系,面向對象主要是一種設計的思路。使用面向對象進行應用程序開發能夠非常好的將現實中的物體進行抽象,這樣就在一定程度上豐富了應用程序的結構,不僅如此,面向對象還包括繼承、多態等特性以便能夠快速構架應用程序。3

2、.1.1 傳統的面向過程 在傳統應用程序開發領域(如C語言的開發),或者是早期的基于B/S領域的Web應用程序開發(如ASP)都使用的是傳統的面向過程的開發語言。而C+/JAVA/C#等開發都是使用的面向對象的開發語言。面向對象的開發語言更接近人類理解自然的語言,對開發人員來說更加通俗易懂,同時也對“對象”進行了較好的抽象。面向過程的一段C語言代碼如下所示。 main() sum(x,y); get(x,y); print(x); print(y); 上述代碼截取了C語言中的一個代碼段,從上述代碼中可以看出,C語言中基本沒有對象的概念。當執行一個主方法Main時,按照程序邏輯調用不同的函數,來

3、達到運算的目的。傳統的面向過程的開發必須規定每一個步驟,或者明確每一種函數,并在程序運行中調用不同的函數來實現運算的目的。面向過程的思想決定了其沒有派生、覆蓋、繼承等特性,所以每當創建一個新的“對象”時,就有可能需要編寫更多的代碼,這在一定程度上造成了代碼的編寫和維護的困難。3.1.2 面向對象的概念在面向過程的開發當中,開發人員發現在調用函數的時候,很難分清楚函數本身是屬于哪個文件的,在代碼的閱讀上面,不同的開發人員會發現很難讀懂其他的開發人員的代碼。雖然注釋和良好的命名都是必要的,但是還是給開發人員之間的交互造成了極大的困擾。為了解決這個問題,于是有了面向對象的概念。面向對象的一段C#代碼

4、如下所示。 class Program/主程序類 public int sum(int x, int y)/sum方法 return x + y;/返回值 static void Main(string args)/靜態方法 int x = 1, y = 2;/聲明整型變量 Program sum = new Program();/創建對象 Console.WriteLine(sum.sum(x, y);/輸出方法返回值 上述代碼中,sum是一個Program對象,sum有一個方法sum進行加法運算。讀者可能會疑惑,相對于面向過程,面向對象的代碼量好像變多了,而且執行的方法過程并沒有太大的區別

5、。其實面向對象解決了代碼難以劃分結構、代碼可讀性不高的問題,讓程序變得更加容易組織和閱讀。例如在.NET中的Convert.ToInt32靜態方法,當閱讀到此代碼的時候,開發人員能夠比較清楚的知道這個方法做了什么操。而在調用面向過程中的函數的時候,如果函數的名稱是CTi32,而又分不清該函數在上下文中起到的作用時,會比較難以理解這個方法究竟做了什么。3.1.3 面向組件的概念面向組件其實是面向對象的另一種加強。在面向對象中,常常需要引用命名空間或者引用頭文件(如C+)來說明一個函數所在的對象與另一個同樣名稱的函數所在的對象是不同的。在傳統的應用程序開發過程中,當客戶更改了若干需求,往往只需要修

6、改一個很小的功能,就要改動很多的代碼,因此就出現了軟件危機。于是人們使用了分層的概念,將代碼封裝在一個類,然后對類進行組織協調,通過編譯器對類或類庫進行編譯,形成DLL組件。在應用程序中使用DLL,從而提高了代碼的重用性。分層的概念也是設計模式的開端。面向組件的概念在平時就已經被讀者廣泛使用了,例如.NET中的某些類庫,還有COM組件等。面向組件的概念對開發人員在設計的思想上要求更高,這些要求不僅僅局限于編碼。3.2 面向對象的C#實現C#是面向對象的編程語言。在面向對象開發當中,不可避免的要創建一個類,創建類后還需要創建該類的屬性和方法來描述對象,然后再創建這個類的對象進行實例化。創建后的對

7、象能夠通過類中的屬性和方法完成相應的操作。3.2.1 定義什么是對象?世間萬物皆對象,在生活中,可能是一只貓、一只狗,或者是餅干、一張訂單、銀行卡等等都是對象。對象描述了一個物體的特征,抽象一個實際的物體或一個方法。類定義了對象的特征,對對象進行了描述。這些特征包括對象的屬性、對象的方法、對象的權限,以及如何訪問該對象。在生活中就有很多例子,例如人類屬于世界上的動物,并屬于哺乳動物,同樣,貓、狗、鳥也屬于哺乳動物。所以,哺乳動物能夠描述人類、貓、狗、鳥的一些基本特性。但是,人類會說話;貓會爬樹;鳥會飛,不同的動物之間,實現的功能又不盡相同。所以這些對象之間也是有區別的。程序開發人員能夠為哺乳動

8、物定義基本的相同的特性,如重量、體色、有沒有毛之類,同樣也能定義哺乳動物是否能夠行走和飛行或者進行其他的操作。當然,如果定義了人類能夠飛行,這是非常不符合邏輯的,類的設計同時也是需要符合邏輯。注意:雖然在類設計中,能夠自行設計相應的類和方法,以及屬性,例如人類能夠飛行,但是這個類的設計是不復合邏輯的,也是沒有必要的。所以在類設計中,只要盡量完整的描述與現實中相同的屬性即可。3.2.2 創建一個類和其方法上一節中了解了什么是面向對象,初學者可能還是對什么是面向對象、什么是對象、為什么要使用面向對象等概念很模糊。這里可以通過創建一個類可以深入了解面向對象的概念。在Visual Studio 200

9、8 中,系統提供了類的創建向導,如圖3-1所示。圖3-1 創建一個類創建一個類的步驟如下所示。(1)在Visual Studio 2008中打開一個項目。(2)右擊該項目,在下拉菜單中選擇【添加】選項,在【添加】下拉菜單中選擇【新建項】選項。(3)在彈出對話框中選擇【類】選項并,如圖3-1所示,并給類一個名稱。(3)單擊【添加】按鈕,類就添加到項目中了。技巧:也可以在導航菜單欄中的【文件】菜單欄中選擇【新建文件】創建一個類文件。在創建了類文件之后,就能夠編寫代碼創建類描述對象,為了能夠描述哺乳動物,這里創建一個Animal類,示例代碼如下所示。using System;using System

10、.Collections.Generic;using System.Linq;/聲明命名空間using System.Text;/不同的命名空間namespace MyClass/聲明命名空間 class Animal/定義類 使用C#創建一個類,命名空間會包含在類文件中。默認命名空間通常與創建的項目名稱相同,示例代碼如下所示。namespace MyClass/當前程序的命名空間類被創建之后,可以向類中添加方法、屬性等,以便更加清晰的描述該對象,示例代碼如下所示。namespace MyClass public class Animal/創建對象 string color;/對象包含的字段

11、public string get()/對象的方法 return color;/執行的方法 在主函數中,可以調用Animal類并創建該類的對象并執行相應的方法,這樣就能夠很好的描述一個對象并執行相應對象的動作,示例代碼如下所示。 static void Main(string args) Animal an = new Animal();/創建對象 an.get();/執行方法 上述代碼首先創建了一個Animal對象an,在創建對象后執行了對象的get方法進行該對象的顏色的獲取,從而得到了一個動物an的顏色。3.2.3 類成員在C#中,類包含若干個組成成員,這些組成成員包括字段、屬性、方法、事

12、件等,這些組成成員能夠彼此協調用于對象的深入描述。1字段“字段”是包含在類中的對象的值,字段使類可以封裝數據,字段的存儲可以滿足類設計中所需要描述。例如上一節中Animal類中的字段color,就是用來描述動物的顏色。當然,Animal的特性不只顏色,可以聲明多個字段描述Animal類的對象,示例代碼如下所示。 class Animal public string color;/聲明顏色字段 public bool haveFeather;/聲明是否含有羽毛字段 public int age;/年齡字段 上述代碼中,對Animal類聲明了另外兩個字段,用來描述是否有羽毛和年齡。當需要訪問該類的

13、字段的時候,需要聲明對象,并使用點“.”操作符實現,Visual Studio 2008中對“.”操作符有智能提示功能,示例代碼如下所示。 Animal bird = new Animal();/創建對象 bird.haveFeather = true;/鳥有羽毛 bird.color = "black"/這是一只黑色的鳥2屬性C#中,屬性是類中可以像類的字段一樣訪問的方法。屬性可以為字段提供保護,避免字段在用戶創建的對象不知情的情況下下被更改。屬性機制非常靈活,提供了讀取、編寫或計算私有字段的值,可以像公共數據成員一樣使用屬性。在C#中,它們被稱為“訪問器”,為C#應用程

14、序中類的成員的訪問提供安全性保障。當一個字段的權限為私有(private)時,不能通過對象的“.”操作來訪問,但是可以通過“訪問器”來訪問,示例代碼如下所示。 public class Animal private int _age;/定義私有變量 public int Age get return _age; set _age = value; /賦值屬性 上述代碼中為Animal類聲明了一個屬性Age,在主程序中,同樣可以通過“.”操作符來訪問屬性,示例代碼如下所示。 Animal bird = new Animal();/創建對象 bird.Age = 1;/Age訪問了_age在Vis

15、ual Studio 2008中,屬性的聲明被簡化,不再需要冗長的聲明,示例代碼如下所示。 public class Animal/創建類 public int Age get; set; /簡便的屬性編寫 注意:雖然在VS2008中,簡化了代碼,但是實現的過程依舊沒有改變。3方法方法用來執行類的操作,方法是一段小的代碼塊。在C#中,方法接收輸入的數據參數,并通過參數執行函數體,返回所需的函數值,方法的語法如下所示。 私有級別 返回類型 方法名稱(參數1,參數2) 方法代碼塊。 方法在類中聲明。對方法的聲明,需要指定訪問級別、返回值、方法名稱以及任何必要的參數。參數在方法名稱后的括號中,多個參

16、數用逗號分割,空括號表示無參數,示例代碼如下所示。 public string output()/一個無參數傳遞的方法 return "沒有任何參數"/返回字符串值 public string out_put(string output)/一個有參數傳遞的方法 return output;/返回參數的值 上述代碼中,創建了兩個方法,一個是無參數傳遞方法output和一個參數傳遞的方法out_put,在主函數中可以調用該方法,調用代碼如下所示。 Animal bird = new Animal();/創建對象 bird.out_put();/使用無參數的方法 string s

17、tr = "我是一只鳥"/創建字符串用于參數傳遞 bird.out_put(str);/使用有參數的方法如上述代碼所示,主函數調用了一個方法out_put,并傳遞了參數“我是一只鳥”。在使用類中的方法前,將“我是一只鳥”賦值給變量str,傳遞給out_put函數。在上述代碼中,“我是一只鳥”或者str都可以作為參數。在應用程序開發中,方法和方法之間也可以互相傳遞參數,一個方法可以作為另一個方法的參數,方法的參數還可以作為另一個方法的返回值,示例代碼如下所示。 public string output()/一個無參數傳遞的方法 return "沒有任何參數"

18、;/返回字符串 public string out_put()/使用其他方法返回值的方法 string str = output();/使用另一個方法的返回值 return str;/返回方法的返回值 如上述代碼所示,out_put使用了output方法,output返回一個字符串“沒有任何參數”。在out_put方法中,使用了output方法,并將output方法的返回值賦給str局部變量,并返回局部變量。在方法的編寫中,方法和方法之間可以使用同一個變量而互不影響,因為方法內部的變量是局部變量,示例代碼如下所示。 public string output()/一個無參數傳遞的方法 strin

19、g str = "沒有任何參數"/聲明局部變量str return str;/使用局部變量str public string out_put()/一個無參數傳遞的方法 string str = "還是沒有任何參數"/聲明局部變量str return str;/使用局部變量str 如上述代碼所示,output和out_put方法都沒有任何參數,但是卻使用了同一個變量str。str是局部變量,str的作用范圍都在該變量聲明的方法內,稱作“作用域”。創建了一個方法,就必須指定該方法是否有返回值。如果有返回值,則必須指定返回值的類型,示例代碼如下所示。 publ

20、ic int sum(int number1, int number2)/必須返回int類型的值 return number1 + number2;/返回一個int類型的值 public void newsum(int number1, int number2)/void表示無返回值 int sum = number1 + number2;/沒有返回值則不能返回值 上述代碼中,聲明了兩個方法,分別為sum和newsum。sum方法中,聲明了該方法是共有的返回值為int的方法,而newsum方法聲明了是共有的無返回值方法。4事件事件是一個對象向其他對象提供有關事件發生的通知的一種方式。在C#中,

21、事件是使用委托來定義和觸發的。類或對象可以通過事件向其他類或對象通知發生的相關事情。發送或引發事件的類稱為“發行者”,接收或處理事件的類稱為“訂閱者”。例如在Web Form中雙擊按鈕的過程,就是一個事件,控件并不對過程做描述,只是負責通知一個事件是否發生。事件具有以下特點:q 事件通常使用委托事件處理程序進行聲明。q 事件始終通知對象消息并指示需要執行某種操作的一種方式。q 發行者確定何時引發事件,訂閱者確定執行何種操作來響應該事件。q 一個事件可以有多個訂閱者。一個訂閱者可處理來自多個發行者的多個事件。q 沒有訂閱者的事件永遠不會被調用。q 事件通常用于通知用戶操作,例如,圖形用戶界面中的

22、按鈕單擊或菜單選擇操作。q 如果一個事件有多個訂閱者,當引發該事件時,會同步調用多個事件處理程序,也可以使用異步處理多個事件。聲明委托和事件的示例代碼如下所示。 public delegate void AnimalEventHandler();/聲明委托 public class Animal/創建類 public event AnimalEventHandler OnFly;/聲明事件 public void Fly()/創建類的方法 OnFly();/使用事件 上述代碼定義了一個委托,并針對相關委托聲明了一個方法。關于委托和事件,會在后面的章節中講到,上述代碼在主函數調用代碼如下所示。

23、Animal bird = new Animal();/創建對象 bird.OnFly += new AnimalEventHandler(TestAnimal);/注冊事件 bird.Fly();/使用方法3.2.4 構造函數和析構函數構造函數和析構函數是面向對象中一個非常特別的函數,構造函數在對象初始化時被執行而析構函數在對象被銷毀時被執行。開發人員無需顯式的進行函數的編寫,在C#應用程序開發中能夠為開發人員提供默認的構造函數和析構函數。1構造函數在變量中,常常需要初始化變量,而在類的聲明中,也需要構造和初始化類。在類中,構造函數是在第一次創建對象時調用的方法。在任何時候,只要創建了一個對

24、象,編譯器就會默認的調用構造函數并執行構造函數。構造函數與類名相同,并且一個類可以有一個或多個構造函數,示例代碼如下所示。 public class Animal/創建一個類 public string AnimalName;/創建AnimalName名稱字段 public Animal()/使用構造函數 AnimalName = "動物"/賦值私有變量 上述代碼聲明了一個Animal類,并使用構造函數,構造函數與類同名。當聲明一個對象時,系統默認使用此構造函數進行對象的構造。另外,構造函數也可以傳遞參數,示例代碼如下所示。 public class Animal/創建一個

25、類 public string AnimalName;/創建AnimalName名稱字段 public Animal()/無參數的構造函數 AnimalName = "動物"/賦值私有變量 public Animal(string name)/有參數的構造函數 AnimalName = name; /私有變量獲取傳遞的參數 構造函數可以傳遞參數,當聲明一個對象時,若不指定構造函數,系統會默認使用無參數的構造函數。在初始化時,若指定構造函數,系統會按照指定的構造函數構造對象,示例代碼如下所示。 Animal dog = new Animal("狗");/通

26、過構造函數創建對象 Console.WriteLine(dog.AnimalName);/輸出對象的屬性在初始化中,直接將參數初始化并傳遞給構造函數則會在初始化中為對象中的字段初始化。構造函數方便了開發人員設置默認值、限制實例化來編寫靈活并且便于閱讀的代碼。2析構函數析構函數是將當前對象從內存中移除時運行和調用的方法,析構函數的使用通常是為了確保需要釋放的對象資源都得到了適當的處理。析構函數的函數名和類名基本相同,在方法前還需要“”符號來聲明該方法是類的析構函數。對于析構函數,有以下幾個特點。q 只能對類定義析構函數,結構不支持析構函數。q 一個類只能有一個析構函數。q 無法繼承或重載析構函數

27、。q 無法調用析構函數,在對象注銷時,系統會自動調用。q 析構函數即沒有修飾符也不能為它傳遞參數。創建析構函數示例代碼如下所示。 public class Animal/創建類 public string AnimalName;/創建AnimalName名稱字段 public Animal()/使用構造函數 AnimalName = "動物" /賦值共有字段 Animal()/使用析構函數 AnimalName = String.Empty;/將字符串清空 上述代碼中,當Animal類的對象被銷毀時,同時也將AnimalName設置為String.Empty。構造函數隱式的

28、對對象的基類調用Finalize,所以開發人員無法控制在何時調用析構函數。在C+中,當對象被銷毀時,系統會調用析構函數并釋放對象,而在C#中,垃圾回收機制會自動清理對象資源。在確保了對象沒有被任何應用程序使用后,C#的垃圾回收機制會自動清除不再使用的對象的資源。對于開發人員而言,雖然可以顯式的使用Collect進行垃圾回收機制,但是會影響應用程序的性能。3.3 對象的生命周期在上一節中聲明了類并說明了類成員,這些類成員包括字段、方法、事件、構造函數以及析構函數。類是對象的設計圖(也稱為模板),類用于描述對象。在創建對象后,對象就開始了其生命周期,只有在生命周期內的對象才能夠被使用,否則無法使用

29、相應的對象。3.3.1 類成員的訪問類聲明的方法是以class關鍵字開頭,后面緊接著類名字,并以“”“”大括號包裹住類成員,示例代碼如下所示。 訪問權限 class 類名稱 類成員 例如在3.2.2中創建了一個Animal類,其中類名稱就是Animal。在實例化一個對象之后,在主程序或其他代碼段中,需要對實例化的對象進行訪問,即需要對類成員的訪問。訪問類成員的方法就是在對象后使用“.”號,并通過Visual Studio 2008智能提示選擇相應的類成員,示例代碼如下所示。using System;using System.Collections.Generic;using System.Li

30、nq;/使用LINQ命名空間using System.Text;/使用文本命名空間namespace MyClass public class Animal/創建一個類 string type;/聲明了類成員string type public void SetType(string type)/聲明了類方法 this.type = type;/字段賦值 class Program/主程序類 static void Main(string args)/程序入口方法 Animal bird = new Animal();/創建了一個bird對象 bird.SetType("bird&q

31、uot;);/引用了一個對象的成員 上述代碼中,創建了一個公共類Animal,并創建了類成員字段type和方法SetType。在主函數中,創建了一個Animal對象bird,并通過“.”號訪問了類成員SetType方法。在訪問類或類成員時,可以通過關鍵字來限制類或類成員的訪問權限,以便只有該類的派生類才能訪問或者使用,同時也能夠限制類成員的權限,提高類成員的安全性。這些關鍵字包括public、private、protected和internal。這個要記住的1public共有權限public字段具有最高訪問級別,任何它的對象或者其他的類都能對public關鍵字所修飾的類或類成員進行訪問,示例代

32、碼如下所示。 public class Animal/共有的類 public string type;/共有的字段 public void SetType(string type)/共有的方法 this.type = type;/賦值共有字段 2private私有權限private字段具有最低的訪問級別,它能夠保證類和類成員的安全,卻限制了其他類或對象對它的訪問。私有成員只有在聲明他們的類之后才能訪問,示例代碼如下所示。 public class Animal private int age;/私有成員 string type;/默認的私有成員 public void SetType(stri

33、ng type) this.type = type;/賦值私有成員 3protected保護權限protected字段具有保護類中字段的功能,能夠保證類和類成員的安全性,也能夠限制其他類或對象對它的訪問。但是與private不同的是,protected能夠在類和類的的派生類中使用,比private具有更高的訪問級別,又比public擁有更低的訪問級別,保證了類的安全性,示例代碼如下所示。 public class Animal protected string str;/受保護的成員 4internal程序集保護權限internal字段修飾的類或類成員只有在同一程序集的文件中內部類型或成員才可

34、以訪問,示例代碼如下所示。 public class Animal internal string str;/受保護的程序集內的成員 這種程序集的文件中內部類型或成員才可以訪問的修飾符通常是基于組件開發的,因為它能夠使一組組件能夠以私有方式進行合作,保證了組件的安全性。通常情況下,ASP.NET中頁面控件都是通過內部組件方式進行合作。另一方面,這些訪問權限修飾符還能夠組合使用,例如protected internal就可以進行組合使用,組合使用所修飾的對象只有該類和該類派生的類的成員才可以訪問。3.3.2 類的類型每一個類的對象都是獨立的對象,對象與對象之間有共同的屬性,但是對象與對象之間不存

35、在聯系,雖然很多情況下類也可以引用類,示例代碼如下所示。 public class Animal/創建類 public string type;/創建字符串型共有變量 class Program/主程序類 static void Main(string args)/程序入口方法 Animal bird = new Animal();/bird對象 bird.type = "bird"/初始化字段 Animal cat = new Animal();/cat對象 cat.type = "cat"/初始化字段 上述代碼創建了兩個對象,一個對象為bird,另一

36、個為cat對象。在初始化類成員時,為不同的對象的類成員賦了不同值,雖然這些類成員的名稱相同,但是“.”號說明了該成員所在的對象是不同的。另外,由于類是引用類型,所以類的對象之間可以互相賦值,示例代碼如下所示。 Animal newbird = new Animal();/創建對象 newbird = bird;/對象之間互相賦值上述代碼將對象newbird初始化后并通過bird賦值,所以對象newbird中的type的值等于對象bird中的type值,因為newbird和bird都是引用的同一個對象。3.3.3 .NET的垃圾回收機制當創建一個對象,.NET對該對象初始化并在內存相應位置存儲,

37、當一個對象執行析構函數時,該對象被銷毀并釋放相關資源。在C+中,使用析構函數能夠讓開發人員顯式的釋放資源。而在.NET中,由于使用了垃圾回收機制(GC)從而導致開發人員無法控制析構函數是何時被運行的。垃圾回收機制監視對象的生存周期,當一個對象沒有被任何應用程序引用時,垃圾回收器就釋放對象所占的內存以及資源。在基于.NET Framework編程時,開發人員無需像C+中顯式的釋放對象的資源也無需關心對象所占用的內存,因為.NET Framework的垃圾回收器能夠監視對象并在相應的時候釋放對象的資源。垃圾回收機器沒有固定的工作模式。它的工作間隔是不可預期的,一般情況下,當應用程序占用的內存不足的

38、時候會啟用垃圾回收器釋放未被引用的對象的資源。在應用程序使用復雜并昂貴的外部資源的時候,.NET機制提供接口能夠讓開發人員實現垃圾回收,以及資源釋放機制,通過實現來自IDisposable接口的Dispost方法可以完成顯式的資源釋放。在ASP.NET或者Win Form開發中,顯式的使用Dispost方法能夠提高應用程序的性能。同樣,析構函數也是一種清理資源的方法,在對象析構時,可以用Dispose對對象的資源,以及連接信息進行清空從而對對象進行釋放。3.4 使用命名空間在應用程序開發過程中,類和類成員的名稱是豐富的,為了描述一個具體的對象,需要對類成員進行設計。在設計類和類成員過程中,不可

39、避免的類成員中的方法或者類的名稱會出現相同的情況,這樣就會使類的使用變得復雜,代碼的混亂造成可讀性降低,使用命名空間可以解決此類難題。3.4.1 為什么要用命名空間正如引言中所述,在設計類和類成員的過程中,不可避免的,類或類成員使用的名稱都是相同的,這樣就讓開發更加復雜,代碼可讀性降低。使用命名空間能夠解決此類問題,示例代碼如下所示。namespace Programmer1/程序員1的命名空間 public class Animal/ Programmer1的Animal類 public string type;/聲明字段 namespace Programmer2/程序員2的命名空間 pu

40、blic class Animal/ Programmer1的Animal類 public string type;/聲明字段 上述代碼中,創建了同樣的兩個類Animal以及兩個類成員type。在主函數中,開發人員很難區分到底是使用哪一個類進行對象的創建和初始化,因為通常情況下,每個程序員可能只負責該程序員的模塊或者代碼,當整合的時候,代碼就會變得難以調用或難以維護。正如某個學校有兩個班級,每個班級里都有一個叫小明的人。如果在早操大會上點名小明,那么這兩個小明都不知道點的是誰,如果指定一下,說是一班的小明,那么二班的小明就不會認為是自己了。命名空間就起到了這個區分的作用,在主函數中,可以顯式的

41、對類進行訪問,示例代碼如下所示。namespace Programmer1/程序員1的命名空間 public class Animal/ Programmer1的Animal類 public string type;/聲明字段 namespace Programmer2/程序員2的命名空間 public class Animal/ Programmer2的Animal類 public string type;/聲明字段 namespace MyClass/主程序的命名空間 class Program/主程序類 static void Main(string args)/主程序入口方法 Prog

42、rammer1.Animal bird = new Programmer1.Animal();/說明是程序員1的命名空間下的Animal bird.type = "bird"/初始化字段 上述代碼中很好的解決了類名稱相同的情況下開發和維護的困難。在執行代碼Programmer1.Animal bird = new Programmer1.Animal()時,編譯器就能夠知道Animal類是屬于命名空間Programmer1的,也就不會和命名空間Programmer2的Animal類混淆。3.4.2 創建命名空間程序開發中,創建和良好的使用命名空間,對開發和維護都是有利的,命

43、名空間語法格式如下所示。namespace 命名空間 類以及類成員namespace聲明了一個命名空間,名稱取命名空間的名稱,在由“”“”大括號內引用的類成員來創建類。同樣也可以創建兩層或多層命名空間,示例代碼如下所示。namespace Programmer1/單層命名空間 public class Animal/ Programmer1的Animal類 public string type;/聲明字段 namespace Programmer2/雙層命名空間 namespace Programmer3/ Programmer2的命名空間 public class Animal/ Progr

44、ammer3的Animal類 public string type;/聲明字段 同樣,命名空間成員也通過“.”號訪問,例如訪問雙層命名空間的類的字段時,可以通過Programmer2. Programmer3.Animal.type進行訪問。3.4.3 分層設計中使用命名空間從上一節中可以看出,命名空間的使用可以對相同名稱的類進行較好的規范。但是,在同一層代碼塊中,似乎很少使用命名空間來規范。而在分層設計中,命名空間的使用是非常必要的,雖然初學者不需要詳細的了解分層設計,但是分層設計在軟件開發過程當中是非常必要的,使用Visual Studio 2008能夠輕松的創建分層構架軟件。在解決方案資

45、源管理器中選擇當前解決方案,右擊【解決方案】項目,在下拉菜單中選擇【添加】選項,在【添加】的下拉菜單中選擇【新建項目】選項。若無法在解決方案管理器中看見解決方案,則可以在菜單欄的【工具】選項中選擇【選項】菜單并在彈出窗口中找到【項目和解決方案】窗口,在窗口中選中【總是顯示解決方案】復選框即可配置解決方案管理器,如圖3-2所示。為了能夠在應用程序中進行分層開發,需要創建類庫用于類的規劃,創建一個“類庫”項目,如圖3-3所示。 圖3-2 顯示解決方案 圖3-3 創建類庫輸入項目名稱,創建了類庫后,命名空間就是創建的項目名稱,系統會自動創建一個類Class1,讀者可自行修改類名稱,并創建字段和方法,

46、示例代碼如下所示。using System;using System.Collections.Generic;using System.Linq;using System.Text;/使用系統命名空間namespace MyNamsSpace/當前程序命名空間 public class Class1/當前類名稱 public string output()/輸出字符串方法 return "另一個項目的命名空間"/返回值 在原有的項目中,必須聲明使用用戶創建的命名空間,才可以訪問命名空間類的類并創建對象。正如.NET中為我們提供的系統命名空間一樣,也是通過使用using來聲明的。首先需要添加引用,右擊項目,在下拉菜單中選擇【添加引用】選項,在添加引用窗口選項卡上選擇【項目】標簽并引用相應類庫,如圖3-4所示。圖3-4

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論