- 新手學(xué)ASP.NET 3.5網(wǎng)絡(luò)開發(fā)
- 孔琳俊 陳松等編著
- 1624字
- 2018-12-27 20:32:16
2 C#面向?qū)ο蟮奶匦?/h2>
面向?qū)ο笫钱?dāng)前計(jì)算機(jī)界關(guān)心的重點(diǎn),是軟件開發(fā)方法的主流,本章從面向?qū)ο蟮幕靖拍钊胧郑敿?xì)分析面向?qū)ο笾械闹R(shí)點(diǎn)。面向?qū)ο笾饕婕暗母拍钣校侯悺?duì)象、接口、繼承、多態(tài)等,本章主要介紹C#中關(guān)于這些概念的應(yīng)用。
2.1 面向?qū)ο缶幊谈攀?/h3>
面向?qū)ο缶幊蹋∣OP)是將現(xiàn)實(shí)中的事物抽象化,其設(shè)計(jì)的重點(diǎn)就是類的設(shè)計(jì)。本節(jié)介紹OOP開發(fā)中的一些基本術(shù)語。
2.1.1 什么是類和對(duì)象
類是面向?qū)ο蟪绦蛟O(shè)計(jì)的核心,實(shí)際上是一種復(fù)雜的數(shù)據(jù)類型。將不同類型的數(shù)據(jù)和與這些數(shù)據(jù)相關(guān)的操作封裝在一起,就構(gòu)成了類。而將抽象化的類具體化,就成了對(duì)象,通常說對(duì)象是類的實(shí)例。
類是將現(xiàn)實(shí)事物抽象化,而對(duì)象是將事物具體化。如“張三”是一個(gè)“學(xué)生”,那么張三其實(shí)是比較具體的一個(gè)人,而“學(xué)生”則是一個(gè)抽象事物。此時(shí)可以創(chuàng)建一個(gè)學(xué)生類,包含學(xué)號(hào)、年齡、班級(jí)等,如果指名張三的這些屬性,則張三是學(xué)生類的一個(gè)實(shí)例。
現(xiàn)在創(chuàng)建一個(gè)學(xué)生類“Student”,代碼如下所示,其中g(shù)et是類的訪問器,用來返回對(duì)象的實(shí)際值。
1. public class Student 2. { 3. public string StudentNo 4. {get{return"";}} 5. public int StudentAge 6. {get{return 0;}} 7. public string StudentGrade 8. {get{return"";}} 9. }
現(xiàn)在來實(shí)例化這個(gè)類,即創(chuàng)建一個(gè)對(duì)象“zhang”,代碼如下所示。
Student zhang = new Student();
通過這個(gè)實(shí)例,希望讀者能夠明白對(duì)象和類的概念,以及對(duì)象和類的關(guān)系。
2.1.2 用C#如何創(chuàng)建類
【本節(jié)示例參考:\示例代碼\C02\ StudentClassAPP】
定義類的語法是基本相同的,但不同的工具創(chuàng)建類的方法會(huì)不同,下面演示在Windows應(yīng)用程序中創(chuàng)建類的步驟。
1 新建一個(gè)Windows應(yīng)用程序“StudentClassAPP”,在解決方案資源管理器中,在根目錄上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“添加|新建項(xiàng)”菜單命令,打開“添加新項(xiàng)”對(duì)話框,如圖2.1所示。

圖2.1 “添加新項(xiàng)”對(duì)話框
2 選中“類”模板,修改名稱為“Student.cs”。單擊“添加”按鈕,此時(shí)在根目錄下生成一個(gè)“Student.cs”類文件,默認(rèn)生成的代碼如下所示,其中最頂端的3行代碼,表示引用的程序集,這些程序集保存在.NET Framework中。namespace表示類所在的命名空間,默認(rèn)會(huì)是當(dāng)前的應(yīng)用程序名。
1. using System; 2. using System.Collections.Generic; 3. using System.Text; 4. 5. namespace WindowsApplication3 6. { 7. class Student 8. { 9. } 10. }
3 上面生成了一個(gè)空的Student類,現(xiàn)在為類添加成員:學(xué)號(hào)、年齡、班級(jí)。代碼如下所示。如果希望外部對(duì)象可以訪問類中的各個(gè)成員,則成員的作用域?yàn)椤皃ublic”,如“StudentNo”。如果變量只在類中有效,則作用域?yàn)椤皃rivate”,如“ no”。
1. class Student 2. { 3. private string_no; 4. private int_age; 5. private string_grade; 6. public string StudentNo//學(xué)號(hào) 7. { 8. get{return_no;} 9. set{_no=value;} 10. } 11. public int StudentAge//年齡 12. { 13. get{return_age;} 14. set{_age=value;} 15. } 16. public string StudentGrade//班級(jí) 17. { 18. get{return_grade;} 19. set{_grade=value;} 20. } 21. }
4 在定義類中的成員時(shí),本例使用了get{ }和set{ },這是類的兩個(gè)訪問器。get表示讀取,set表示編寫,如果一個(gè)成員只允許讀取,則不需要set{}語句,相反則不需要get{}語句。在set語句中有個(gè)關(guān)鍵字“value”,用來表示用戶賦給成員的值。
5 保存這些代碼,VS2008會(huì)自動(dòng)編譯Student類。
2.1.3 用C#如何創(chuàng)建對(duì)象
前面創(chuàng)建了類“Student”,本例學(xué)習(xí)如何在C#中創(chuàng)建類的對(duì)象,演示步驟如下:
1 打開Windows應(yīng)用程序“StudentClassAPP”。
2 在Form1.cs設(shè)計(jì)界面中,添加1個(gè)Button和1個(gè)Label,其中Label用來顯示文本。Button用來處理業(yè)務(wù)邏輯。
3 雙擊Button按鈕,切換到窗體的代碼視圖,書寫創(chuàng)建對(duì)象的代碼如下所示。
1. private void button1_Click(object sender,EventArgs e) 2. { 3. Student zhang=new Student();//創(chuàng)建對(duì)象 4. //以下其實(shí)是使用了類的編寫器set 5. zhang.StudentNo="BJ100010"; 6. zhang.StudentAge=16; 7. zhang.StudentGrade="高二"; 8. //顯示對(duì)象的內(nèi)容,其實(shí)是使用了類的讀取器get 9. label1.Text=zhang.StudentNo+zhang.StudentAge.ToString()+zhang.StudentGrade; 10. }
4 保存所有的代碼。按F5運(yùn)行程序,單擊“Button”按鈕,可以看到Label顯示了對(duì)象的內(nèi)容。
2.1.4 什么是面向?qū)ο缶幊?/h4>
面向?qū)ο缶幊蹋∣bject-Oriented Programming),簡(jiǎn)稱OOP,:是將程序的相關(guān)邏輯,包括屬性和行為封裝到編程所需的“對(duì)象”中。面向?qū)ο蟮木幊陶Z言,使得復(fù)雜的工作條理清晰、編寫容易。
面向?qū)ο缶幊讨粤餍校且驗(yàn)槠溥_(dá)到了軟件工程的三個(gè)主要目標(biāo):重用性、靈活性和擴(kuò)展性。面向?qū)ο缶幊痰幕舅枷胧鞘褂脤?duì)象的繼承、封裝、多態(tài)等來進(jìn)行程序開發(fā)。面向?qū)ο缶幊痰谋举|(zhì)是以對(duì)象為中心,編寫可重復(fù)利用、可方便擴(kuò)展的代碼。
圖2.2以圖形的方式,展示了面向?qū)ο箝_發(fā)的一個(gè)標(biāo)準(zhǔn)過程。

圖2.2 面向?qū)ο箝_發(fā)的標(biāo)準(zhǔn)過程
2.2 面向?qū)ο蟮募夹g(shù)
面向?qū)ο蟮年P(guān)鍵技術(shù)就是對(duì)象、類、接口、繼承和多態(tài)。對(duì)象和類在第一節(jié)已經(jīng)詳細(xì)介紹過,本節(jié)介紹接口、繼承和多態(tài)。
2.2.1 接口
接口只包含成員的定義,不包含成員的實(shí)現(xiàn),成員是指類中的方法、屬性、索引器和事件等。接口的主要目的是為不相關(guān)的類,提供通用的屬性和行為,如C#中的接口“IDbConnection”,用來定義數(shù)據(jù)源的連接,提供了多個(gè)未實(shí)現(xiàn)的屬性和方法,開發(fā)者可以自定義2個(gè)類“SqlConnection”和“AccessConnection”,并繼承IDbConnection接口,那么這2個(gè)類就具備相同的成員,但實(shí)現(xiàn)內(nèi)容不同,因?yàn)镾qlConnection用來連接SQL Server數(shù)據(jù)庫,而AccessConnection用來連接Access數(shù)據(jù)庫。下面的代碼演示一個(gè)簡(jiǎn)單的接口定義。其中“interface”是定義接口的關(guān)鍵字。
1. interface IConnection 2. { 3. public string DatabaseName; 4. public void AddDataBase(); 5. public string GetDataBaseConn(); 6. }
接口就好像一個(gè)模板,提供基本成員的結(jié)構(gòu),但并沒有添加實(shí)質(zhì)性的內(nèi)容。由于C#不能實(shí)現(xiàn)多個(gè)類的繼承,而可以實(shí)現(xiàn)多個(gè)接口的繼承,所以使用接口,是可以讓一個(gè)類具備兩個(gè)以上基類的唯一方式。
2.2.2 用C#如何創(chuàng)建接口
現(xiàn)在演示用C#創(chuàng)建一個(gè)接口,步驟如下:
1 打開應(yīng)用程序,在解決方案資源管理器中,右擊根目錄,在彈出的快捷菜單中,選擇“添加|新建項(xiàng)”菜單命令,打開項(xiàng)模板對(duì)話框。
2 選中“接口”模板,默認(rèn)名稱為“Interface1.cs”。單擊“添加”按鈕,此時(shí)在根目錄下生成一個(gè)“Interface1.cs”類文件,默認(rèn)代碼如下所示。
1. using System; 2. using System.Collections.Generic; 3. using System.Text; 4. 5. namespace WindowsApplication3 6. { 7. interface Interface1 8. { 9. } 10. }
3 默認(rèn)生成一個(gè)空的接口“Interface1”,設(shè)計(jì)一個(gè)公司員工的接口定義,代碼如下所示。
1. interface Interface1 2. { 3. string EmployeeNmae;//員工姓名 4. void AddEmployee();//添加員工 5. void DelEmployee();//刪除員工 6. string EmployeeAddress;//員工住址 7. }
4 保存并編譯所有的代碼。
2.2.3 繼承
繼承就是從父類中獲取一些公開的成員,如方法和屬性。繼承的語法如下所示。
class Student:Person //繼承類 class Student:Interface1 //繼承接口
子類和父類之間以“:”間隔,C#只允許繼承一個(gè)父類,但允許繼承(或者說實(shí)現(xiàn))多個(gè)接口。如果子類繼承(實(shí)現(xiàn))了接口,則必須實(shí)現(xiàn)接口中定義的所有公開成員。
所謂公開的成員,就是在父類中被定義為public的成員,因?yàn)閜ublic的作用域,可以在子類中生效,而private的作用域則不可。
2.2.4 用C#如何實(shí)現(xiàn)繼承
本節(jié)創(chuàng)建了一個(gè)父類,一個(gè)子類,并介紹了如何調(diào)用子類。演示步驟如下:
1 創(chuàng)建一個(gè)類“ParentClass”作為父類,代碼如下所示,只定義了一個(gè)屬性“ParentName”。
1. class ParentClass 2. { 3. private string_name; 4. public string ParentName//父類名 5. { 6. get{return_name;} 7. set{_name=value;} 8. } 9. }
2 再創(chuàng)建一個(gè)類“SonClass”作為子類,代碼如下所示,要求其繼承“ParentClass”類。同時(shí)還定義了一個(gè)屬性“SonName”。
1. class SonClass:ParentClass 2. { 3. private string_name; 4. public string SonName//子類名 5. { 6. get{return_name;} 7. set{_name=value;} 8. } 9. }
3 在窗體中調(diào)用子類的代碼如下所示。
SonClass myson=new SonClass(); //創(chuàng)建子類對(duì)象 myson.ParentName="父名"; //自動(dòng)繼承父類的屬性 myson.SonName="子名"; //子類自己的屬性
2.2.5 多態(tài)
多態(tài)是指類可以有多種形態(tài),通過修改可以形成多個(gè)類的實(shí)現(xiàn)方法。當(dāng)子類從父類繼承時(shí),它會(huì)獲得父類的所有方法、字段、屬性和事件。若要更改父類的數(shù)據(jù)和行為,通常有兩種選擇:可以創(chuàng)建新的成員替換父級(jí)成員,或者可以重寫虛擬的父級(jí)成員。
如果要替換父級(jí)成員,需要使用new關(guān)鍵字。下面代碼演示了GetName方法的2種形態(tài),一種是返回父級(jí)名稱,一種是返回子級(jí)名稱。
1. class ParentClass //父類 2. { 3. public string GetName() 4. { 5. return"父級(jí)名稱"; 6. } 7. } 8. class SonClass:ParentClass //子類繼承父類 9. { 10. public new string GetName() 11. { 12. return"子級(jí)名稱"; 13. } 14. }
如果要重寫虛擬的父級(jí)成員,需要兩個(gè)條件,父級(jí)成員使用了關(guān)鍵字“virtual”,而子級(jí)成員使用關(guān)鍵字“override”。下面演示這種形式下的GetName方法。
1. class ParentClass //父類 2. { 3. public virtual string GetName() 4. { 5. return"父級(jí)名稱"; 6. } 7. } 8. class SonClass:ParentClass //子類繼承父類 9. { 10. public override string GetName() 11. { 12. return"子級(jí)名稱"; 13. } 14. }
2.2.6 用C#如何實(shí)現(xiàn)多態(tài)
使用多態(tài)要注意被調(diào)用的究竟是哪一種形態(tài)。本例通過兩個(gè)類和1個(gè)方法,演示多態(tài)的使用,實(shí)現(xiàn)步驟如下所示:
1 創(chuàng)建類“Employee”,表示公司里的員工。代碼如下所示,其包含一個(gè)虛方法getDepart。
1. class Employee //父類 2. { 3. public virtual string getDepart() 4. { 5. return"總公司"; 6. } 7. }
2 創(chuàng)建類“MarketEmployee”,表示市場(chǎng)部員工,代碼如下所示,其重寫了父類的getDepart方法。
1. class MarketEmployee:Employee //子類繼承父類 2. { 3. public override string getDepart() 4. { 5. return"市場(chǎng)部"; 6. } 7. }
3 下面代碼演示了如何調(diào)用這2種形態(tài)的方法,注釋中還給出了運(yùn)行結(jié)果。
Employee myee=new Employee(); //創(chuàng)建父類 string str1= myee.getDepart(); //結(jié)果為“父公司” MarketEmployee yee=new MarketEmployee(); //創(chuàng)建子類 string str2 = yee.getDepart();//結(jié)果為“市場(chǎng)部”
2.3 面向?qū)ο箝_發(fā)的簡(jiǎn)單實(shí)例
為了讓讀者徹底地掌握面向?qū)ο箝_發(fā)的技術(shù),本節(jié)以一個(gè)非常簡(jiǎn)單的案例,介紹如何在日常應(yīng)用開發(fā)中,采用面向?qū)ο蠹夹g(shù)。
2.3.1 面向?qū)ο蠊δ茉O(shè)計(jì)
本例要實(shí)現(xiàn)的功能是在一個(gè)公司中有2個(gè)部門:采購部和銷售部,這2個(gè)部門的員工具備相同的屬性:?jiǎn)T工號(hào)、姓名、年齡、住址,但銷售部員工還有一個(gè)比較特別的屬性:銷售額。2個(gè)部門的員工也具備相同的“操作”:上班和下班。但采購部還有一個(gè)操作是采購,銷售部還有一個(gè)操作是銷售。圖2.3以圖形方式展現(xiàn)了這2個(gè)部門的相同點(diǎn)和不同點(diǎn)。

圖2.3 2個(gè)部門的相似點(diǎn)和不同點(diǎn)
2.3.2 面向?qū)ο蟮念愒O(shè)計(jì)
根據(jù)這2個(gè)部門的共性和特性,又為了以后擴(kuò)展的需要,設(shè)計(jì)一個(gè)員工類(Employee),此類包含所有員工的共性。因?yàn)楦鱾€(gè)部門又有自己的特性,所以為每個(gè)部門單獨(dú)設(shè)計(jì)一個(gè)類,但這些類必須繼承員工類,才能包含那些共性。
圖2.4是一個(gè)標(biāo)準(zhǔn)的類設(shè)計(jì)圖,其中SaleEmployee表示銷售部門員工類,BuyEmployee表示采購部門員工類,這2個(gè)類都繼承自Employee(員工類)。

圖2.4 標(biāo)準(zhǔn)的類設(shè)計(jì)圖
2.3.3 面向?qū)ο蟮膽?yīng)用
【本節(jié)示例參考:\示例代碼\C02\ OOPSample】
本節(jié)將根據(jù)類的設(shè)計(jì)創(chuàng)建一個(gè)應(yīng)用程序,創(chuàng)建的步驟如下:
1 打開VS2008,新建一個(gè)項(xiàng)目“OOPSample”。
2 在解決方案資源管理器的根目錄下,添加一個(gè)類“Employee.cs”,類的設(shè)計(jì)代碼如下所示,主要是設(shè)計(jì)員工的共性。
1. class Employee 2. { 3. //私有屬性的設(shè)計(jì) 4. private int_id; 5. private string_name; 6. private int_age; 7. private string_address; 8. public int EmployeeID //員工號(hào) 9. { 10. get{return_id;} 11. set{_id=value;} 12. } 13. public string Name //員工號(hào) 14. { 15. get{return_name;} 16. set{_name=value;} 17. } 18. public int Age //員工號(hào) 19. { 20. get{return_age;} 21. set{_age=value;} 22. } 23. public string Address //員工號(hào) 24. { 25. get{return_address;} 26. set{_address=value;} 27. } 28. public void WorkOn() 29. { 30. //上班操作的代碼 31. } 32. public void WorkOff() 33. { 34. //下班操作的代碼 35. } 36. }
3 在根目錄下再添加一個(gè)類“SaleEmployee.cs”,此類繼承Employee類,代碼如下所示,主要是設(shè)計(jì)銷售部員工的特性。
1. class SaleEmployee:Employee 2. { 3. private int_salecount; 4. public int SaleCount//銷售額 5. { 6. get{return_salecount;} 7. set{_salecount=value;} 8. } 9. public void Sale() 10. { 11. //銷售操作的代碼 12. } 13. }
4 在根目錄下再添加一個(gè)類“BuyEmployee.cs”,此類繼承Employee類,代碼如下所示,主要是設(shè)計(jì)采購部員工的特性。
1. class BuyEmployee:Employee 2. { 3. public void Buy() 4. { 5. //采購操作的代碼 6. } 7. }
5 下面的代碼演示如何在應(yīng)用程序中,使用這2個(gè)部門的類。
SaleEmployee mysale = new SaleEmployee();//實(shí)例化銷售部員工類 mysale.Name = "銷售員1"; mysale.Sale(); //銷售操作 mysale.WorkOff(); //下班 label1.Text=mysale.SaleCount.ToString(); //顯示此員工的銷售額 BuyEmployee mybuy = new BuyEmployee();//實(shí)例化采購部員工類 mybuy.Name = "采購員1"; mybuy.WorkOn();//上班 mybuy.Buy();//采購
承上啟下
■ 學(xué)完本章后,讀者需要回答:
1.什么是類?什么是對(duì)象?
2.如何聲明類、屬性、方法?
3.如何編譯類?
4.什么是接口,如何用C#實(shí)現(xiàn)一個(gè)接口?
5.什么是多態(tài),如何實(shí)現(xiàn)類的多態(tài)?
6.什么是繼承?如何實(shí)現(xiàn)類的繼承?
7.是否對(duì).NET基礎(chǔ)類庫框架有了初步的認(rèn)識(shí)?
8.如何設(shè)計(jì)應(yīng)用程序中的類,如何應(yīng)用對(duì)象?
■ 在下一章中,讀者將會(huì)了解:
1.ASPX的幾個(gè)核心對(duì)象。
2.使用Response對(duì)象向?yàn)g覽器輸出字符串。
3.使用Request對(duì)象接受用戶的POST方式和GET方式提交的數(shù)據(jù)。
4.使用Server對(duì)象獲取服務(wù)器的信息。
5.使用Application對(duì)象實(shí)現(xiàn)程序級(jí)別的數(shù)據(jù)共享。
6.使用Session對(duì)象實(shí)現(xiàn)會(huì)話級(jí)別的數(shù)據(jù)共享。
- scikit-learn Cookbook
- 國(guó)際大學(xué)生程序設(shè)計(jì)競(jìng)賽中山大學(xué)內(nèi)部選拔真題解(二)
- Mastering Objectoriented Python
- WSO2 Developer’s Guide
- 基于差分進(jìn)化的優(yōu)化方法及應(yīng)用
- Java持續(xù)交付
- SQL Server 2012數(shù)據(jù)庫管理與開發(fā)項(xiàng)目教程
- 用Python實(shí)現(xiàn)深度學(xué)習(xí)框架
- 程序員修煉之道:通向務(wù)實(shí)的最高境界(第2版)
- 圖數(shù)據(jù)庫實(shí)戰(zhàn)
- Python機(jī)器學(xué)習(xí)之金融風(fēng)險(xiǎn)管理
- PHP 7從零基礎(chǔ)到項(xiàng)目實(shí)戰(zhàn)
- 零基礎(chǔ)學(xué)C語言程序設(shè)計(jì)
- Webpack實(shí)戰(zhàn):入門、進(jìn)階與調(diào)優(yōu)(第2版)
- OpenCV 3計(jì)算機(jī)視覺:Python語言實(shí)現(xiàn)(原書第2版)