官术网_书友最值得收藏!

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ù)共享。

主站蜘蛛池模板: 托里县| 博野县| 台南市| 安乡县| 城固县| 巧家县| 眉山市| 长顺县| 汉川市| 永定县| 永年县| 玛沁县| 平和县| 栾川县| 建平县| 手游| 大足县| 平南县| 太仆寺旗| 巴彦县| 鹿泉市| 即墨市| 邢台市| 烟台市| 泾源县| 余江县| 武隆县| 城步| 安丘市| 普格县| 达日县| 南乐县| 怀集县| 哈巴河县| 南康市| 泉州市| 新建县| 永定县| 瓦房店市| 铁岭市| 栖霞市|