版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第7章面向?qū)ο蠛皖?.1面向?qū)ο缶幊谈攀?.1.1結(jié)構(gòu)化程序設(shè)計結(jié)構(gòu)化程序設(shè)計是為了解決早期計算機程序的難于閱讀、理解和調(diào)試,難于維護和擴充,以及開發(fā)周期長、不易控制程序的質(zhì)量等問題而提出來的,它的產(chǎn)生和發(fā)展奠定了軟件工程的基礎(chǔ)。結(jié)構(gòu)化程序設(shè)計的基本思想是:自頂向下,逐步求精,將整個程序結(jié)構(gòu)劃分成若干個功能相對獨立的模塊,模塊之間的聯(lián)系盡可能簡單;每個模塊用順序、選擇、循環(huán)三種基本結(jié)構(gòu)來實現(xiàn);每個模塊只有一個入口和一個出口。
第7章面向?qū)ο蠛皖?.1面向?qū)ο缶幊谈攀?第7章面向?qū)ο蠛皖?.1.1結(jié)構(gòu)化程序設(shè)計結(jié)構(gòu)化程序設(shè)計的優(yōu)點:(1)各模塊可以分別編程,使程序易于閱讀、理解、調(diào)試和修改;(2)方便新功能模塊的擴充;(3)功能獨立的模塊可以組成子程序庫,有利于實現(xiàn)軟件復(fù)用等。由于這些優(yōu)點,結(jié)構(gòu)化程序設(shè)計方法出現(xiàn)以后,很快被人們接受并得到廣泛應(yīng)用。第7章面向?qū)ο蠛皖?.1.1結(jié)構(gòu)化程序設(shè)計2第7章面向?qū)ο蠛皖?.1.1結(jié)構(gòu)化程序設(shè)計結(jié)構(gòu)程序設(shè)計的問題:結(jié)構(gòu)化程序設(shè)計方法以解決問題的過程作為出發(fā)點,其方法是面向過程的。它把程序定義為:“數(shù)據(jù)結(jié)構(gòu)+算法”程序中數(shù)據(jù)與處理這些數(shù)據(jù)的算法(過程)是分離的。這樣,對不同的數(shù)據(jù)結(jié)構(gòu)作相同的處理,或?qū)ο嗤臄?shù)據(jù)結(jié)構(gòu)作不同的處理,都要使用不同的模塊,降低了程序的可維護性和可復(fù)用性。同時,由于這種分離,導(dǎo)致了數(shù)據(jù)可能被多個模塊使用和修改,難于保證數(shù)據(jù)的安全性和一致性。第7章面向?qū)ο蠛皖?.1.1結(jié)構(gòu)化程序設(shè)計3第7章面向?qū)ο蠛皖?.1.1結(jié)構(gòu)化程序設(shè)計
對于小型程序和中等復(fù)雜程度的程序來說,結(jié)構(gòu)化程序設(shè)計是一種較為有效的技術(shù),但對于復(fù)雜的、大規(guī)模的軟件的開發(fā)來說,它就不盡如人意了。可以看出:結(jié)構(gòu)化程序設(shè)計的核心思想是功能的分解,特點是將數(shù)據(jù)結(jié)構(gòu)與過程分離,著重點在過程。用這種方法開發(fā)的軟件可維護性和可復(fù)用性差。
第7章面向?qū)ο蠛皖?.1.1結(jié)構(gòu)化程序設(shè)計4第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟮某绦蛟O(shè)計(Object-OrientedProgramming)是一種基于結(jié)構(gòu)分析的、以數(shù)據(jù)為中心的程序設(shè)計方法。它的主要思想是:將數(shù)據(jù)及處理這些數(shù)據(jù)的操作都封裝(Encapsulation)到一個稱為類(Class)的數(shù)據(jù)結(jié)構(gòu)中。使用這個類時,只需要定義一個類的變量即可,這個變量叫做對象(Object)。通過調(diào)用對象的數(shù)據(jù)成員完成對類的使用。在該方法下,編程人員不需要過分關(guān)注“如何做”,而重點關(guān)注“做什么”。
第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計5第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計結(jié)構(gòu)化程序設(shè)計方法與面向?qū)ο蟪绦蛟O(shè)計的區(qū)別:(1)結(jié)構(gòu)化程序設(shè)計方法是面向過程的結(jié)構(gòu)化方法,程序設(shè)計從算法入手,然后是數(shù)據(jù)結(jié)構(gòu)。(2)面向?qū)ο蟪绦蛟O(shè)計(OOP)首先考慮的是程序處理的數(shù)據(jù)結(jié)構(gòu),即對象。第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計6第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計在面向?qū)ο蟪绦蛟O(shè)計中:(1)對象是構(gòu)成軟件系統(tǒng)的基本單元;(2)從同類型的對象中抽象出一種新型的數(shù)據(jù)類型,即類,
對象只是類的實例;(3)類的成員中不僅包含有描述類對象屬性的數(shù)據(jù),還包含有對這些數(shù)據(jù)進行處理的程序代碼(這些程序代碼被稱為對象的行為或操作)。第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計7第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計在面向?qū)ο蟪绦蛟O(shè)計中:(1)對象是構(gòu)成軟件系統(tǒng)的基本單元;(2)從同類型的對象中抽象出一種新型的數(shù)據(jù)類型,即類,
對象只是類的實例;(3)類的成員中不僅包含有描述類對象屬性的數(shù)據(jù),還包含有對這些數(shù)據(jù)進行處理的程序代碼(這些程序代碼被稱為對象的行為或操作)。第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計8第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計何為封裝?將對象的屬性和行為放在一起作為一個整體的方法。封裝將對象的大部分行為的實現(xiàn)隱蔽起來,僅通過一個可控的接口與外界交互。類的派生:面向?qū)ο蟪绦蛟O(shè)計提供了類的繼承性,可通過對一個被稱為基類的類增添不同的特性來派生出多種被稱為派生類的特殊類,使得類與類之間建立了層次結(jié)構(gòu)關(guān)系,為軟件復(fù)用提供了有效的途徑。第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計9第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計的基本思想:數(shù)據(jù)的分解,即著重點放在被操作的數(shù)據(jù)上而不是實現(xiàn)操作的過程上。它把數(shù)據(jù)及其操作作為一個整體對待,數(shù)據(jù)本身不能被外部過程直接存取。思想的特點是:程序一般由類的定義和類的使用兩部分組成,主程序中定義各個對象并規(guī)定它們之間傳遞消息的規(guī)律,程序中的一切操作都通過向?qū)ο蟀l(fā)送消息來實現(xiàn),對象接收到消息后,調(diào)用有關(guān)對象的行為來完成相應(yīng)的操作。優(yōu)點:用這種方法開發(fā)的軟件可維護性和可復(fù)用性高。第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計10第7章面向?qū)ο蠛皖?.1.3類和對象概述在面向?qū)ο蟪绦蛟O(shè)計方法中,類是對自然現(xiàn)象或?qū)嶓w的程序語言描述,對象是對類的實例化。例如:類:類可以泛指某一批外形、價格、生產(chǎn)廠家、出廠日期完全一致的筆;對象:用這個類聲明的一個對象是這些筆中一支實實在在的筆。而且單純從這一支筆中可以得到這樣的常識:它具有一定的屬性(外形、價格、顏色、長短)、具有一定的行為(寫字、繪畫),和“筆”這個類具有相同的屬性和行為。第7章面向?qū)ο蠛皖?.1.3類和對象概述11第7章面向?qū)ο蠛皖?.1.3類和對象概述例如,筆是類,鋼筆、鉛筆、毛筆可以是筆的子類,2B鉛筆可以是鉛筆的子類。張紅買了1支2B鉛筆,假設(shè)該鉛筆叫APEN,則APEN就是類(2B鉛筆類)的實例,稱為對象,它可以有顏色、價格、長度、形狀等屬性。第7章面向?qū)ο蠛皖?.1.3類和對象概述12第7章面向?qū)ο蠛皖惷嫦驅(qū)ο蟪绦蛟O(shè)計的主要特性有:(1)封裝
封裝就是把相關(guān)的數(shù)據(jù)和代碼結(jié)合成一個有機的整體,形成數(shù)據(jù)和操作代碼的封裝體,對外只提供一個可以控制的接口,內(nèi)部大部分的實現(xiàn)細(xì)節(jié)對外隱蔽,達(dá)到對數(shù)據(jù)訪問權(quán)的合理控制。封裝使程序中個部分之間的相互聯(lián)系達(dá)到最小,提高了程序的安全性,簡化了程序代碼的編寫工作,是面向?qū)ο蟪绦蛟O(shè)計的重要原則
第7章面向?qū)ο蠛皖惷嫦驅(qū)ο蟪绦蛟O(shè)計的主要特性有:13第7章面向?qū)ο蠛皖悾?)繼承(代碼重用)
在面向?qū)ο蟪绦蛟O(shè)計中,繼承表達(dá)的是對象類之間的關(guān)系,這種關(guān)系使得一類對象可以繼承另一類對象的屬性(數(shù)據(jù))和行為(操作),從而,提供了通過現(xiàn)有的類創(chuàng)建新類的方法,也提高了軟件復(fù)用的程度。
第7章面向?qū)ο蠛皖悾?)繼承(代碼重用)14第7章面向?qū)ο蠛皖悾?)多態(tài)多態(tài)是指不同的對象受到相同的消息時產(chǎn)生不同的操作行為,或者說同一個消息可以根據(jù)發(fā)送消息的對象的不同而采用多種不同的操作行為。多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計的重要特性之一,例如:當(dāng)用鼠標(biāo)單擊不同的對象時,各對象就會根據(jù)自己的理解作出不同的動作,產(chǎn)生不同的結(jié)果,這就是多態(tài)性。簡單地說,多態(tài)性就是一個接口,多種方式。
C++語言支持兩種多態(tài)性,即編譯時的多態(tài)性和運行時的多態(tài)性。編譯時的多態(tài)性是用函數(shù)的重載來實現(xiàn)的,運行時的多態(tài)性是用虛函數(shù)來實現(xiàn)的。第7章面向?qū)ο蠛皖悾?)多態(tài)15第7章面向?qū)ο蠛皖悾?)重載(overloading)
允許使用具有相同的方法名稱的多個方法.區(qū)分方法的途徑是方法具有不同的參數(shù)列表。如求立方的方法:
intCube(intnumber);floatCube(floatnumber);doubleCube(doublenumber);第7章面向?qū)ο蠛皖悾?)重載(overloading)16第7章面向?qū)ο蠛皖?.2命名空間
在許多高級語言中,為了使編譯系統(tǒng)內(nèi)核盡量小,常常把每次編譯中肯定要用到的部分放入編譯內(nèi)核,而將其他部分生成獨立的單元放入到外圍,用戶在使用時,通過特定的命令將其調(diào)入。例如:
C和C++語言中,系統(tǒng)將許多函數(shù)和預(yù)定義預(yù)存到一些稱為頭文件的文本文件中,用戶在使用時,通過#include的命令就可以把這一部分調(diào)入并和源程序一起編譯。第7章面向?qū)ο蠛皖?.2命名空間17第7章面向?qū)ο蠛皖?.2命名空間
在C#中,系統(tǒng)提供了命名空間來組織程序。在.NET編程環(huán)境中,命名空間是一個很重要的概念,它提供了一個邏輯上的層次結(jié)構(gòu)體系。命名空間既可以作為程序的內(nèi)部組織系統(tǒng),又可以作為程序的外部組織系統(tǒng)。當(dāng)作為外部組織系統(tǒng)時,命名空間中的元素可以為其他程序所用。第7章面向?qū)ο蠛皖?.2命名空間18第7章面向?qū)ο蠛皖?.2.1命名空間的聲明命名空間的聲明方法為:
namespace命名空間名
{
命名空間定義體
};命名空間前面不需要有任何修飾符,命名空間聲明的最后一個分號可以省略。第7章面向?qū)ο蠛皖?.2.1命名空間的聲明19第7章面向?qū)ο蠛皖?.2.1命名空間的聲明一個C#程序可以包含一個或多個編譯單元,每個編譯單元包含在一個獨立的源文件中(編譯單元就是能夠被編譯的最小單位)。當(dāng)C#程序被編譯時,編譯器會對程序的所有編譯單元進行統(tǒng)一處理。在一個編譯單元中命名空間名的聲明必須惟一,不能出現(xiàn)同名命名空間,否則系統(tǒng)會出現(xiàn)編譯錯誤。另外,雖然編譯單元可能會相互依賴,但編譯單元使用的命名空間調(diào)用語句只對本單元的屬性和命名空間成員聲明產(chǎn)生影響,不會影響到其他的編譯單元中。第7章面向?qū)ο蠛皖?.2.1命名空間的聲明20形式1:
namespaceNameSpaceOutside{//命名空間NameSpaceOutside的定義體部分
namespaceNameSpaceInside{//命名空間NameSpaceInside的定義體部分
}}形式2:
namespaceNameSpaceOutside.NameSpaceInside{//命名空間NameSpaceInside的定義體部分
}命名空間中的各個成員,如果沒有另外聲明,默認(rèn)的訪問修飾符是public,在其他命名空間中可以直接訪問。命名空間聲明時可以嵌套。例如:形式1:形式2:命名空間中的各個成員,如果沒有另外聲明,默認(rèn)21
如果在一個命名空間中使用其他已定義好的命名空間,只需要在這個命名空間使用using語句便可對其他命名空間進行引用。例如:NamespaceMyNameSpace{usingSystem;
usingNameSpaceOutside;
//命名空間的其他定義部分}
在該例中,命名空間MyNameSpace在定義體中引用了系統(tǒng)命名空間System和此前定義的命名空間NameSpaceOutside。注意,在一個命名空間體內(nèi),如果要引用其他命名空間,應(yīng)該在聲明其他任何類型之前引用。在該例中,如果把兩行using命令放置到“命名空間的其他定義部分”之后就會出現(xiàn)編譯錯誤。如果在一個命名空間中使用其他已定義好的命名空間,只需22
如果多個命名空間具有相同的完整合法名稱,那么這幾個命名空間屬于一個命名空間。namespaceNameSpace{classA{}}namespaceNameSpace{classB{}}
該例中,兩個命名空間聲明具有相同的完整合法名NameSpace,所以它們屬于同一個命名空間。此后對命名空間NameSpace中的類訪問時,只需要直接使用NameSpace.A或NameSpace.B即可。如果多個命名空間具有相同的完整合法名稱,那么這幾個命23第7章面向?qū)ο蠛皖?.2.2命名空間的成員
在一個命名空間中可以包含多個成員聲明,這些聲明共同組成了這個命名空間的成員。命名空間的成員類型多種多樣,可以是一個類、結(jié)構(gòu)、接口、枚舉、委托等結(jié)構(gòu),也可以是另一個命名空間。無論是哪一種,命名空間成員類型聲明都分別和各自類型聲明要求一致。
第7章面向?qū)ο蠛皖?.2.2命名空間的成員24第7章面向?qū)ο蠛皖?.2.2命名空間的成員
類型聲明可以出現(xiàn)在編譯單元的第一行中作為頂層聲明,也可以出現(xiàn)在命名空間、類或結(jié)構(gòu)的內(nèi)部作為成員聲明。如果類型聲明以頂層聲明出現(xiàn),新聲明的類型作為一個獨立于其他編譯單元的類型,此時,這個類型的名字本身就是它的完整合法名稱。如果一個類型聲明在一個命名空間、類或結(jié)構(gòu)內(nèi)部,那么此類型就以它所在的命名空間、類或結(jié)構(gòu)的成員身份出現(xiàn),它的完整合法名應(yīng)該與所在命名空間、類或結(jié)構(gòu)關(guān)聯(lián)起來表示,中間以“.”隔開。例如:用S代表要聲明的類型,N代表命名空間、類或結(jié)構(gòu)。如果S是頂層聲明,則S的完整合法名就是簡單的類型S,如果類型S聲明在N內(nèi)部,則S的完整合法名就是N.S
第7章面向?qū)ο蠛皖?.2.2命名空間的成員25第7章面向?qū)ο蠛皖?.2.2命名空間的成員
對類型聲明的訪問權(quán)限與該類型聲明所處的位置有關(guān):(1)在編譯單元或者命名空間中聲明的類型,可以具有公有(public)或內(nèi)部(internal)兩種訪問權(quán)限。默認(rèn)的訪問權(quán)限是內(nèi)部。(2)在類中聲明的類型,訪問權(quán)限可以是公有(public)、保護(protected)、內(nèi)部(internal)、私有(private),默認(rèn)的訪問方式是私有。(3)在結(jié)構(gòu)中聲明的類型,訪問權(quán)限可以是公有(public)、保護(protected)、私有(private),默認(rèn)的訪問方式是私有。第7章面向?qū)ο蠛皖?.2.2命名空間的成員26第7章面向?qū)ο蠛皖?.2.3命名空間的使用
在C#中,命名空間的調(diào)用是通過using指令實現(xiàn)的。using指令有兩種用途:一種是別名使用指令,可以定義一個命名空間或類型的別名;另一種是命名空間使用指令,可以引入一個命名空間的類型成員。
using指令的有效范圍是指該指令所屬的編譯單元或命名空間。第7章面向?qū)ο蠛皖?.2.3命名空間的使用27第7章面向?qū)ο蠛皖?.2.3命名空間的使用(1)別名使用指令與C或C++中的#define命令類似,C#中可以使用別名使用指令為命名空間或類型定義別名,此后的程序就可以使用這個別名來代替定義的這個命名空間或類型。別名使用指令的格式為:
using別名=命名空間名或類型名;利用別名使用指令可以避免使用冗長的命名空間,例如下面代碼:usingLastMessage=MyProgram.MessageManagement.AllMessage.NextMessage;第7章面向?qū)ο蠛皖?.2.3命名空間的使用利用別名使用指28再看下面的例子:namespaceNameSpace1.NameSpace2{classA{}}namespaceNameSpace3{usingR=NameSpace1.NameSpace2.A;
classB:R{}}namespaceNameSpace1.NameSpace2{classA{}}namespaceNameSpace3{usingR=NameSpace1.NameSpace2;
classB:R.A{}}再看下面的例子:namespaceNameSpace1.N29利用別名使用指令所定義的別名的有效范圍是該指令所屬的編譯單元或命名空間,因此這里的別名在該編譯單元或命名空間中應(yīng)該是惟一的,不能與其它成員同名,否則就會出錯。例如:namespaceNameSpace1{}namespaceNameSpace2{classClassA{}}namespaceNameSpace2{usingClassA=NameSpace1;}這里的三個命名空間中,后兩個命名空間名一樣,是同一個命名空間。這兩個命名空間中,前一個聲明了一個類ClassA,后一個引用了一個別名使用指示ClassA。二者雖然類型不同,但由于這兩個成員同名,所以出錯。利用別名使用指令所定義的別名的有效范圍是該指令所屬的編譯單元30在使用別名時,如果別名所定義的命名空間或命名空間中的成員不存在,同樣會出現(xiàn)錯誤。例如:namespaceNameSpace1{classClassA{}}namespaceNameSpace2{usingR=NameSpace1.ClassA;classClassB:R.ClassA}在使用別名時,如果別名所定義的命名空間或命名空間中的成員不存31與一般成員一樣,別名使用指令定義的別名在整個命名空間或整個編譯單元內(nèi)都有效,該命名空間內(nèi)其他成員都可直接使用。例如:usingR=NameSpace1;//假設(shè)此前已定義NameSpace1,并且有一個成員是類AnamespaceNameSpace2{classClassB:R.A{}}namespaceNameSpace3{classClassC:R.A{}}與一般成員一樣,別名使用指令定義的別名在整個命名空間或整個編32當(dāng)在一個編譯單元中同時聲明多個別名時,別名的聲明順序沒有關(guān)系,并且每個別名的聲明不會受到自身或別的別名的影響。例如:namespaceNameSpace1.NameSpace2{}namespaceNameSpace3{usingr1=NameSpace1;usingr2=NameSpace1.NameSpace2;usingr3=r1.NameSpace2;}當(dāng)在一個編譯單元中同時聲明多個別名時,別名的聲明順序沒有關(guān)系33第7章面向?qū)ο蠛皖?.2.3命名空間的使用(2)命名空間使用指令命名空間使用指令可以將一個命名空間的類型整個導(dǎo)入到另一個編譯單元或命名空間中,并且對這些類型的使用不需要使用完整合法名稱,直接引用類型名稱即可。命名空間使用指令的格式為:
using命名空間名;命名空間名應(yīng)該是由系統(tǒng)提供的或用戶已定義的命名空間名。和別名不同的是:在包含命名空間的編譯單元或命名空間定義體內(nèi)部,別名在成員聲明時需要引用別名的成員,而命名空間可以直接使用已定義的命名空間的類型,不需要指出命名空間名。第7章面向?qū)ο蠛皖?.2.3命名空間的使用命名空間名應(yīng)該34例如對于大家比較熟悉的系統(tǒng)預(yù)定義的命名空間System,引用該命名空間后,可以直接使用其中的成員。usingSystem;classTest{staticvoidMain(){Console.WriteLIne(“Hello,World!”);}}例如對于大家比較熟悉的系統(tǒng)預(yù)定義的命名空間System,引用35對于用戶自己定義的命名空間,先定義用戶自己的命名空間后也可以直接使用,例如:namespaceNameSpace1.NameSpace2{classClassA{//命名空間NameSpace1.NameSpace2的類ClassA定義體
}}namespaceNameSpace3{usingNameSpace1.NameSpace2;classClassB:ClassA{}}對于用戶自己定義的命名空間,先定義用戶自己的命名空間后也可以36注意:命名空間使用指令只能導(dǎo)入命名空間本身,而不會導(dǎo)入嵌套的命名空間,例如:namespaceNameSpace1.NameSpace2{classClassA{//命名空間NameSpace1.NameSpace2的類ClassA定義體
}}namespaceNameSpace3{usingNameSpace1;classClassB:NameSpace2.ClassA//出錯
{}}注意:命名空間使用指令只能導(dǎo)入命名空間本身,而不會導(dǎo)入嵌套的37如果在編譯單元或命名空間中定義的成員名與命名空間名相同,編譯器將按成員名優(yōu)先的原則。例如:namespaceNameSpace1{classClassA{}classClassB{}}namespaceNameSpace2{usingNameSpace1;classClassB{}}命名空間NameSpace2中使用了命名空間使用指令,但由于編譯器在編譯過程中,按在同一編譯單元或命名空間中成員優(yōu)先的原則,所以命名空間NameSpace2中的ClassB表示的是NameSpace2.ClassB,而不是NameSpace1.ClassB。NameSpace1.ClassB是指命名空間NameSpace1中的那個類ClassB。如果在編譯單元或命名空間中定義的成員名與命名空間名相同,編譯38如果在編譯單元或命名空間中有多個命名空間使用指令使用,而這些命名空間中又包含了相同的類型名,用戶定義和使用時要注意,不要引起二義性。例如:namespaceNameSpace1{classClassA{}}namespaceNameSpace2{classClassA{}}namespaceNameSpace3{usingNameSpace1;usingNameSpace2;classClassB:ClassA//出錯
{}}如果在編譯單元或命名空間中有多個命名空間使用指令使用,而這些39為避免上述錯誤的發(fā)生,在使用過程中,應(yīng)該在程序中直接指明使用的是哪一個成員。例如:namespaceNameSpace1{classClassA{}}namespaceNameSpace2{classClassA{}}namespaceNameSpace3{usingNameSpace1;usingNameSpace2;usingR=NameSpace2.ClassA;classClassB:R{}}為避免上述錯誤的發(fā)生,在使用過程中,應(yīng)該在程序中直接指明使用40第7章面向?qū)ο蠛皖?.2.4命名空間的舉例每個類或類庫都定義在包含該庫中所有類的命名空間中??梢砸悦臻g為單位,將類封裝到給其它程序重用的動態(tài)鏈接庫中,程序可以在執(zhí)行時載入動態(tài)鏈接庫來訪問在很多程序間共享的公用功能。一個動態(tài)鏈接庫代表一個程序集。項目使用類庫時,該項目必須包含對定義類庫的程序集的引用。下面看一下如何將類裝載到動態(tài)鏈接庫中以及如何調(diào)用。先編寫如下程序代碼:第7章面向?qū)ο蠛皖?.2.4命名空間的舉例41VisualC面向?qū)ο蠛皖愓n件42VisualC面向?qū)ο蠛皖愓n件43VisualC面向?qū)ο蠛皖愓n件44VisualC面向?qū)ο蠛皖愓n件45
下面創(chuàng)建一個類AssemblyTest,在該類中引用程序集TimeLibrary.dll,并顯示標(biāo)準(zhǔn)和通用的時間字符串格式:程序運行結(jié)果為:Standardtime:1:27:06PMUniversaltime:13:27:06下面創(chuàng)建一個類AssemblyTest,在該類中引用46第7章面向?qū)ο蠛皖愖⒁恻c:命名空間使用指令在一定程度上能減少同一編譯單元內(nèi)或命名空間的程序代碼量,增加可讀性。但如果使用過多,反而會使程序關(guān)系復(fù)雜,減弱可讀性,增加出錯的可能。因此在使用時,特別是使用用戶自己定義的別名使用指令或命名空間使用指令時,應(yīng)盡可能指明其隸屬關(guān)系。第7章面向?qū)ο蠛皖愖⒁恻c:47第7章面向?qū)ο蠛皖?.3聲明自己的類在面向?qū)ο蟮某绦蛟O(shè)計中,靜態(tài)的基本單位是類,動態(tài)的基本單位是對象,向?qū)ο蟀l(fā)送消息可以激活對象的行為,所以面向?qū)ο蟮某绦蚩梢悦枋鰹椋簩ο?消息傳遞。7.3.1類的聲明類的聲明格式為:
[類修飾符]class類名[:基類類名]{
類的成員;
}C#支持的類修飾符有:new、public、protected、internal、private、abstract和sealed,其含義為:第7章面向?qū)ο蠛皖?.3聲明自己的類48new:新建類,表明由基類中繼承而來的、與基類中同名的成員。
public:公有類,表示外界可以不受限制地訪問。
protected:保護類,表示可以訪問該類或從該類派生的類型。
internal:內(nèi)部類,僅能訪問本程序。
private:私有類,只有該類才能訪問。
abstract:抽象類,是一個不完整的類,只有聲明而沒有具體的實現(xiàn)。一般只能用來做其它類的基類,而不能單獨使用。
sealed:密封類,不能作其它類的基類,不能再派生新的類。使用以上類修飾符應(yīng)注意以下幾點:(1)在一個類聲明中,同一類修飾符不能出現(xiàn)多次;(2)new類修飾符僅允許在嵌套類中表示類聲明時使用,表明類中隱藏了由基類中繼承而來的、與基類中同名的成員。(3)在使用public、protected、internal和private修飾符時,它們不僅表示所定義類的訪問特性,而且還表明類中成員聲明時的訪問特性,并且它們的可用性也會對派生類造成影響。new:新建類,表明由基類中繼承而來的、與基類中同名的成員49
(4)抽象類修飾符abstract和密封類修飾符sealed都是受限類修飾符。抽象類修飾符只能作其它類的基類,不能直接使用。密封類修飾符不能作其它類的基類,可以由其它類繼承而來但不能再派生其它類。一個類不能同時既使用抽象類修飾符又使用密封類修飾符。(5)如果省略類修飾符,則默認(rèn)為私有修飾符private。(6)對于具有繼承關(guān)系的類才有基類。如果一個類沒有從任何類繼承,就不需要基類類名選項。在C#中,一個類只能從另一個類中繼承,而不能從多個類中繼承;如果一個類想繼承多個類的特點,可以采用接口的方法實現(xiàn)。在C#中,對象的定義很簡單,其定義格式為:類名對象名;
創(chuàng)建一個類的實例一般采用new修飾符。例如:(4)抽象類修飾符abstract和密封類修飾符se50usingSystem;classClassA{publicstringc="ThisisClassA.";}classClassB{staticvoidFun(){ClassAa;a=newClassA();Console.WriteLine(a.c);}staticvoidMain(){Fun();}}程序運行結(jié)果為:ThisisClassA.類的繼承也很簡單,請看如下代碼:usingSystem;程序運行結(jié)果為:類的繼承也很簡單,51程序運行結(jié)果為:ThisisClassA.程序運行結(jié)果為:52第7章面向?qū)ο蠛皖?.3.2類的成員在C#中,類的成員分為兩大類,一種不以函數(shù)形式體現(xiàn),稱為成員變量;另一種是以函數(shù)形式體現(xiàn),稱為成員函數(shù)。類的具體成員有以下類型:
常量:代表與類相關(guān)的常量值。
變量:類中的變量。
方法:完成類中各種計算或功能的操作。
屬性:定義類的值,并對它們提供讀、寫操作。
事件:由類產(chǎn)生的通知,用于說明發(fā)生了什么事情。第7章面向?qū)ο蠛皖?.3.2類的成員53索引器:允許編程人員在訪問數(shù)組時,通過索引器訪問類的多個實例。索引器又稱下標(biāo)指示器。運算符:定義類的實例能使用的運算符。類型:屬于類的局部類型。構(gòu)造函數(shù):在類被實例化時首先執(zhí)行的函數(shù),主要是完成對象的初始化操作。析構(gòu)函數(shù):在對象被銷毀之前最后執(zhí)行的函數(shù),主要是完成對象結(jié)束時的收尾操作。提示:以上各類型中,方法、屬性、索引器、運算符、構(gòu)造函數(shù)和析構(gòu)函數(shù)是以函數(shù)形式體現(xiàn),統(tǒng)稱為成員函數(shù)。其它部分統(tǒng)稱為成員變量。索引器:允許編程人員在訪問數(shù)組時,通過索引器訪問類的多個實例54用戶可以根據(jù)具體需要定義類的成員,但定義時需要注意以下幾個問題:(1)由于構(gòu)造函數(shù)規(guī)定為和類名相同,析構(gòu)函數(shù)名規(guī)定為類名前加一個“~”波浪線符號,所以其它成員名就不能命名為和類同名或是類名前加波浪線。(2)類中的常量、變量、屬性、事件或類型不能與其它類成員同名。(3)類中的方法名不能和類中其它成員同名,既包括其它非方法成員,又包括其它方法成員。(4)如果沒有顯示指定類成員訪問修飾符,默認(rèn)類型為私有類型修飾符。用戶可以根據(jù)具體需要定義類的成員,但定義時需要注意以下幾個問55
類的每個成員都需要設(shè)定訪問修飾符,不同的修飾符會造成對成員訪問能力不一樣。C#中成員主要有以下幾種:公有成員。這種成員允許類的內(nèi)部或外界直接訪問,修飾符是public。這是限制最少的一種訪問方式,它的優(yōu)點是使用靈活,缺點是外界可能會破壞對象成員值的合理性。私有成員。外界不能直接訪問該成員變量或成員函數(shù)。對該成員變量或成員函數(shù)的訪問只能由該類中其它函數(shù)訪問,其派生類也不能訪問。保護成員。對于外界該成員是隱藏的,但這個類的派生類則可以訪問。內(nèi)部成員。只有本類的成員才能訪問。下面成員代碼說明了成員訪問修飾符的作用。類的每個成員都需要設(shè)定訪問修飾符,不同的修飾符會造成56classClassA{publicinta;privateintb;protectedintc;publicvoidSetA(){a=1;//正確,類自身的公有成員
b=2;//正確,類自身的私有成員
c=3;//正確,類自身的保護成員
}}classClassB:ClassA{publicvoidSetB(){a=11;//正確,允許訪問基類的公有成員
b=22;//錯誤,不允許訪問基類私有成員
c=33;//正確,允許訪問基類的保護成員
}}classClassC{publicvoidSetC(){ClassABaseA=newClassA();BaseA.a=111;//正確,允許訪問類的其它公有成員
BaseA.b=222;//錯誤,不允許訪問類的其它私有成員
BaseA.c=333;//錯誤,不允許訪問類的其它保護成員
}}classClassAclassClassC57成員又可分為靜態(tài)成員和非靜態(tài)成員。聲明一個靜態(tài)成員只需要在聲明成員的指令前加上static保留字。如果沒有這個保留字就默認(rèn)為非靜態(tài)成員。二者的區(qū)別是:靜態(tài)成員屬于類所有,非靜態(tài)成員則屬于類的對象所有訪問時靜態(tài)成員只能由類來訪問,而非靜態(tài)成員只能由對象訪問。請看下面的代碼:成員又可分為靜態(tài)成員和非靜態(tài)成員。聲明一個靜態(tài)成員只需要在聲58classClassA{publicinta;staticpublicintb;voidFun1()//定義一個非靜態(tài)成員函數(shù)
{a=10;//正確,直接訪問非靜態(tài)成員
b=20;//正確,直接訪問靜態(tài)成員
}staticvoidFun2(){a=10;//錯誤,不允許訪問非靜態(tài)成員
b=20;//正確,允許訪問靜態(tài)成員,相當(dāng)于ClassA.b=20}}classClassA59classTest{staticvoidMain(){ClassAA=newClassA();A.a=111;//正確,訪問類ClassA的非靜態(tài)公有成員變量aA.b=222;//錯誤,不能直接訪問類中靜態(tài)公有成員
ClassA.a=20;//錯誤,不能通過類訪問類中非靜態(tài)公有成員
ClassA.b=20;//正確,可以通過類訪問類ClassA的靜態(tài)公有成員變量b}}classTest60第7章面向?qū)ο蠛皖?.3.3聲明對象類只是個靜態(tài)概念,要想使用類,還需要對類進行實例化,也就是聲明對象,聲明對象后,就可以通過對象訪問類中的公有類型數(shù)據(jù)或成員函數(shù),使用格式為:對象名.成員函數(shù)名或?qū)ο竺?數(shù)據(jù)以筆為例,用類來表示如下:第7章面向?qū)ο蠛皖?.3.3聲明對象61程序運行結(jié)果為:ThePriceis5TheColorisBLACK程序運行結(jié)果為:62第7章面向?qū)ο蠛皖?.4構(gòu)造函數(shù)與析構(gòu)函數(shù)C#中有兩個特殊的函數(shù):構(gòu)造函數(shù):當(dāng)類實例化時首先執(zhí)行的函數(shù)。析構(gòu)函數(shù):當(dāng)實例(即對象)從內(nèi)存中銷毀前最后執(zhí)行的函數(shù)這兩個函數(shù)的執(zhí)行是無條件的,不需要程序員的干預(yù)。也就是說,只要定義一個對象或銷毀一個對象,不用顯示地調(diào)用構(gòu)造函數(shù)或析構(gòu)函數(shù),系統(tǒng)都會自動在創(chuàng)建對象時調(diào)用構(gòu)造函數(shù),在對象銷毀時調(diào)用析構(gòu)函數(shù)。第7章面向?qū)ο蠛皖?.4構(gòu)造函數(shù)與析構(gòu)函數(shù)63第7章面向?qū)ο蠛皖?.4.1構(gòu)造函數(shù)對于剛才的例子,無論是公有成員變量Color,還是私有成員變量Price,在使用時都存在重大隱患。如將類Test進行如下改寫//類的實例化classTest{publicstaticvoidMain(){PenmyPen=newPen();//類的實例化
Console.WriteLine("ThePriceis{0}",myPen.GetPrice());Console.WriteLine("TheColoris{0}",myPen.Color);}}
第7章面向?qū)ο蠛皖?.4.1構(gòu)造函數(shù)//類的實例化64第7章面向?qū)ο蠛皖?.4.1構(gòu)造函數(shù)對于構(gòu)造函數(shù),C#作如下約定:(1)構(gòu)造函數(shù)的函數(shù)名和類的名稱一樣。為類Pen加入構(gòu)造函數(shù)后的代碼如下:第7章面向?qū)ο蠛皖?.4.1構(gòu)造函數(shù)65程序運行結(jié)果為:ThePriceis5TheColorisBLACK程序運行結(jié)果為:66第7章面向?qū)ο蠛皖?.4.1構(gòu)造函數(shù)對于構(gòu)造函數(shù),C#作如下約定:(2)由于系統(tǒng)在對象實例化的同時自動調(diào)用構(gòu)造函數(shù),因此構(gòu)造函數(shù)適于為需要賦初值的變量賦初值。同時由于構(gòu)造函數(shù)只在對象創(chuàng)建時一次性賦予初值,此后就不再起作用了,編程人員不要在程序中調(diào)用構(gòu)造函數(shù)。(3)構(gòu)造函數(shù)可以重載。(4)當(dāng)某個類沒有構(gòu)造函數(shù)時,系統(tǒng)將自動為其創(chuàng)建構(gòu)造函數(shù),這種構(gòu)造函數(shù)稱為默認(rèn)構(gòu)造函數(shù)。Pen(){};第7章面向?qū)ο蠛皖?.4.1構(gòu)造函數(shù)Pen()67第7章面向?qū)ο蠛皖?.4.1構(gòu)造函數(shù)對于構(gòu)造函數(shù),C#作如下約定:(5)構(gòu)造函數(shù)的類型修飾符總是public。如果是private,則表示這個類不能被實例化,這通常用于只含有靜態(tài)成員的類中。(6)構(gòu)造函數(shù)由于不需要顯示調(diào)用,因而不用聲明返回類型。(7)構(gòu)造函數(shù)可以帶參數(shù)也可以不帶參數(shù)。具體實例化時,對于帶參數(shù)的構(gòu)造函數(shù),需要實例化的對象也帶參數(shù),并且參數(shù)個數(shù)要相等,類型要一一對應(yīng)。如果是不帶參數(shù)的構(gòu)造函數(shù),則在實例化時對象不具有參數(shù)。帶參數(shù)的構(gòu)造函數(shù)可以理解為由外界干預(yù)對象的初始化。第7章面向?qū)ο蠛皖?.4.1構(gòu)造函數(shù)68第7章面向?qū)ο蠛皖?.4.2析構(gòu)函數(shù)
析構(gòu)函數(shù)不能帶有參數(shù),不能擁有訪問修飾符,并且不能被顯示地調(diào)用。對象的析構(gòu)函數(shù)在該對象被銷毀時自動調(diào)用。析構(gòu)函數(shù)的名稱是在類名前加一個~符號,例如類Pen的析構(gòu)函數(shù)如下:
~Pen(){}析構(gòu)函數(shù)不能被繼承,也不需要用戶顯示調(diào)用。在實際編程過程中,如果所編寫的類本身沒有動態(tài)申請內(nèi)存操作,一般不需要析構(gòu)函數(shù)。如果類沒有析構(gòu)函數(shù),系統(tǒng)就自動調(diào)用默認(rèn)的析構(gòu)函數(shù)。第7章面向?qū)ο蠛皖?.4.2析構(gòu)函數(shù)析構(gòu)函數(shù)的名69第7章面向?qū)ο蠛皖?.1面向?qū)ο缶幊谈攀?.1.1結(jié)構(gòu)化程序設(shè)計結(jié)構(gòu)化程序設(shè)計是為了解決早期計算機程序的難于閱讀、理解和調(diào)試,難于維護和擴充,以及開發(fā)周期長、不易控制程序的質(zhì)量等問題而提出來的,它的產(chǎn)生和發(fā)展奠定了軟件工程的基礎(chǔ)。結(jié)構(gòu)化程序設(shè)計的基本思想是:自頂向下,逐步求精,將整個程序結(jié)構(gòu)劃分成若干個功能相對獨立的模塊,模塊之間的聯(lián)系盡可能簡單;每個模塊用順序、選擇、循環(huán)三種基本結(jié)構(gòu)來實現(xiàn);每個模塊只有一個入口和一個出口。
第7章面向?qū)ο蠛皖?.1面向?qū)ο缶幊谈攀?0第7章面向?qū)ο蠛皖?.1.1結(jié)構(gòu)化程序設(shè)計結(jié)構(gòu)化程序設(shè)計的優(yōu)點:(1)各模塊可以分別編程,使程序易于閱讀、理解、調(diào)試和修改;(2)方便新功能模塊的擴充;(3)功能獨立的模塊可以組成子程序庫,有利于實現(xiàn)軟件復(fù)用等。由于這些優(yōu)點,結(jié)構(gòu)化程序設(shè)計方法出現(xiàn)以后,很快被人們接受并得到廣泛應(yīng)用。第7章面向?qū)ο蠛皖?.1.1結(jié)構(gòu)化程序設(shè)計71第7章面向?qū)ο蠛皖?.1.1結(jié)構(gòu)化程序設(shè)計結(jié)構(gòu)程序設(shè)計的問題:結(jié)構(gòu)化程序設(shè)計方法以解決問題的過程作為出發(fā)點,其方法是面向過程的。它把程序定義為:“數(shù)據(jù)結(jié)構(gòu)+算法”程序中數(shù)據(jù)與處理這些數(shù)據(jù)的算法(過程)是分離的。這樣,對不同的數(shù)據(jù)結(jié)構(gòu)作相同的處理,或?qū)ο嗤臄?shù)據(jù)結(jié)構(gòu)作不同的處理,都要使用不同的模塊,降低了程序的可維護性和可復(fù)用性。同時,由于這種分離,導(dǎo)致了數(shù)據(jù)可能被多個模塊使用和修改,難于保證數(shù)據(jù)的安全性和一致性。第7章面向?qū)ο蠛皖?.1.1結(jié)構(gòu)化程序設(shè)計72第7章面向?qū)ο蠛皖?.1.1結(jié)構(gòu)化程序設(shè)計
對于小型程序和中等復(fù)雜程度的程序來說,結(jié)構(gòu)化程序設(shè)計是一種較為有效的技術(shù),但對于復(fù)雜的、大規(guī)模的軟件的開發(fā)來說,它就不盡如人意了??梢钥闯觯航Y(jié)構(gòu)化程序設(shè)計的核心思想是功能的分解,特點是將數(shù)據(jù)結(jié)構(gòu)與過程分離,著重點在過程。用這種方法開發(fā)的軟件可維護性和可復(fù)用性差。
第7章面向?qū)ο蠛皖?.1.1結(jié)構(gòu)化程序設(shè)計73第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟮某绦蛟O(shè)計(Object-OrientedProgramming)是一種基于結(jié)構(gòu)分析的、以數(shù)據(jù)為中心的程序設(shè)計方法。它的主要思想是:將數(shù)據(jù)及處理這些數(shù)據(jù)的操作都封裝(Encapsulation)到一個稱為類(Class)的數(shù)據(jù)結(jié)構(gòu)中。使用這個類時,只需要定義一個類的變量即可,這個變量叫做對象(Object)。通過調(diào)用對象的數(shù)據(jù)成員完成對類的使用。在該方法下,編程人員不需要過分關(guān)注“如何做”,而重點關(guān)注“做什么”。
第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計74第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計結(jié)構(gòu)化程序設(shè)計方法與面向?qū)ο蟪绦蛟O(shè)計的區(qū)別:(1)結(jié)構(gòu)化程序設(shè)計方法是面向過程的結(jié)構(gòu)化方法,程序設(shè)計從算法入手,然后是數(shù)據(jù)結(jié)構(gòu)。(2)面向?qū)ο蟪绦蛟O(shè)計(OOP)首先考慮的是程序處理的數(shù)據(jù)結(jié)構(gòu),即對象。第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計75第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計在面向?qū)ο蟪绦蛟O(shè)計中:(1)對象是構(gòu)成軟件系統(tǒng)的基本單元;(2)從同類型的對象中抽象出一種新型的數(shù)據(jù)類型,即類,
對象只是類的實例;(3)類的成員中不僅包含有描述類對象屬性的數(shù)據(jù),還包含有對這些數(shù)據(jù)進行處理的程序代碼(這些程序代碼被稱為對象的行為或操作)。第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計76第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計在面向?qū)ο蟪绦蛟O(shè)計中:(1)對象是構(gòu)成軟件系統(tǒng)的基本單元;(2)從同類型的對象中抽象出一種新型的數(shù)據(jù)類型,即類,
對象只是類的實例;(3)類的成員中不僅包含有描述類對象屬性的數(shù)據(jù),還包含有對這些數(shù)據(jù)進行處理的程序代碼(這些程序代碼被稱為對象的行為或操作)。第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計77第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計何為封裝?將對象的屬性和行為放在一起作為一個整體的方法。封裝將對象的大部分行為的實現(xiàn)隱蔽起來,僅通過一個可控的接口與外界交互。類的派生:面向?qū)ο蟪绦蛟O(shè)計提供了類的繼承性,可通過對一個被稱為基類的類增添不同的特性來派生出多種被稱為派生類的特殊類,使得類與類之間建立了層次結(jié)構(gòu)關(guān)系,為軟件復(fù)用提供了有效的途徑。第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計78第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計面向?qū)ο蟪绦蛟O(shè)計的基本思想:數(shù)據(jù)的分解,即著重點放在被操作的數(shù)據(jù)上而不是實現(xiàn)操作的過程上。它把數(shù)據(jù)及其操作作為一個整體對待,數(shù)據(jù)本身不能被外部過程直接存取。思想的特點是:程序一般由類的定義和類的使用兩部分組成,主程序中定義各個對象并規(guī)定它們之間傳遞消息的規(guī)律,程序中的一切操作都通過向?qū)ο蟀l(fā)送消息來實現(xiàn),對象接收到消息后,調(diào)用有關(guān)對象的行為來完成相應(yīng)的操作。優(yōu)點:用這種方法開發(fā)的軟件可維護性和可復(fù)用性高。第7章面向?qū)ο蠛皖?.1.2面向?qū)ο蟪绦蛟O(shè)計79第7章面向?qū)ο蠛皖?.1.3類和對象概述在面向?qū)ο蟪绦蛟O(shè)計方法中,類是對自然現(xiàn)象或?qū)嶓w的程序語言描述,對象是對類的實例化。例如:類:類可以泛指某一批外形、價格、生產(chǎn)廠家、出廠日期完全一致的筆;對象:用這個類聲明的一個對象是這些筆中一支實實在在的筆。而且單純從這一支筆中可以得到這樣的常識:它具有一定的屬性(外形、價格、顏色、長短)、具有一定的行為(寫字、繪畫),和“筆”這個類具有相同的屬性和行為。第7章面向?qū)ο蠛皖?.1.3類和對象概述80第7章面向?qū)ο蠛皖?.1.3類和對象概述例如,筆是類,鋼筆、鉛筆、毛筆可以是筆的子類,2B鉛筆可以是鉛筆的子類。張紅買了1支2B鉛筆,假設(shè)該鉛筆叫APEN,則APEN就是類(2B鉛筆類)的實例,稱為對象,它可以有顏色、價格、長度、形狀等屬性。第7章面向?qū)ο蠛皖?.1.3類和對象概述81第7章面向?qū)ο蠛皖惷嫦驅(qū)ο蟪绦蛟O(shè)計的主要特性有:(1)封裝
封裝就是把相關(guān)的數(shù)據(jù)和代碼結(jié)合成一個有機的整體,形成數(shù)據(jù)和操作代碼的封裝體,對外只提供一個可以控制的接口,內(nèi)部大部分的實現(xiàn)細(xì)節(jié)對外隱蔽,達(dá)到對數(shù)據(jù)訪問權(quán)的合理控制。封裝使程序中個部分之間的相互聯(lián)系達(dá)到最小,提高了程序的安全性,簡化了程序代碼的編寫工作,是面向?qū)ο蟪绦蛟O(shè)計的重要原則
第7章面向?qū)ο蠛皖惷嫦驅(qū)ο蟪绦蛟O(shè)計的主要特性有:82第7章面向?qū)ο蠛皖悾?)繼承(代碼重用)
在面向?qū)ο蟪绦蛟O(shè)計中,繼承表達(dá)的是對象類之間的關(guān)系,這種關(guān)系使得一類對象可以繼承另一類對象的屬性(數(shù)據(jù))和行為(操作),從而,提供了通過現(xiàn)有的類創(chuàng)建新類的方法,也提高了軟件復(fù)用的程度。
第7章面向?qū)ο蠛皖悾?)繼承(代碼重用)83第7章面向?qū)ο蠛皖悾?)多態(tài)多態(tài)是指不同的對象受到相同的消息時產(chǎn)生不同的操作行為,或者說同一個消息可以根據(jù)發(fā)送消息的對象的不同而采用多種不同的操作行為。多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計的重要特性之一,例如:當(dāng)用鼠標(biāo)單擊不同的對象時,各對象就會根據(jù)自己的理解作出不同的動作,產(chǎn)生不同的結(jié)果,這就是多態(tài)性。簡單地說,多態(tài)性就是一個接口,多種方式。
C++語言支持兩種多態(tài)性,即編譯時的多態(tài)性和運行時的多態(tài)性。編譯時的多態(tài)性是用函數(shù)的重載來實現(xiàn)的,運行時的多態(tài)性是用虛函數(shù)來實現(xiàn)的。第7章面向?qū)ο蠛皖悾?)多態(tài)84第7章面向?qū)ο蠛皖悾?)重載(overloading)
允許使用具有相同的方法名稱的多個方法.區(qū)分方法的途徑是方法具有不同的參數(shù)列表。如求立方的方法:
intCube(intnumber);floatCube(floatnumber);doubleCube(doublenumber);第7章面向?qū)ο蠛皖悾?)重載(overloading)85第7章面向?qū)ο蠛皖?.2命名空間
在許多高級語言中,為了使編譯系統(tǒng)內(nèi)核盡量小,常常把每次編譯中肯定要用到的部分放入編譯內(nèi)核,而將其他部分生成獨立的單元放入到外圍,用戶在使用時,通過特定的命令將其調(diào)入。例如:
C和C++語言中,系統(tǒng)將許多函數(shù)和預(yù)定義預(yù)存到一些稱為頭文件的文本文件中,用戶在使用時,通過#include的命令就可以把這一部分調(diào)入并和源程序一起編譯。第7章面向?qū)ο蠛皖?.2命名空間86第7章面向?qū)ο蠛皖?.2命名空間
在C#中,系統(tǒng)提供了命名空間來組織程序。在.NET編程環(huán)境中,命名空間是一個很重要的概念,它提供了一個邏輯上的層次結(jié)構(gòu)體系。命名空間既可以作為程序的內(nèi)部組織系統(tǒng),又可以作為程序的外部組織系統(tǒng)。當(dāng)作為外部組織系統(tǒng)時,命名空間中的元素可以為其他程序所用。第7章面向?qū)ο蠛皖?.2命名空間87第7章面向?qū)ο蠛皖?.2.1命名空間的聲明命名空間的聲明方法為:
namespace命名空間名
{
命名空間定義體
};命名空間前面不需要有任何修飾符,命名空間聲明的最后一個分號可以省略。第7章面向?qū)ο蠛皖?.2.1命名空間的聲明88第7章面向?qū)ο蠛皖?.2.1命名空間的聲明一個C#程序可以包含一個或多個編譯單元,每個編譯單元包含在一個獨立的源文件中(編譯單元就是能夠被編譯的最小單位)。當(dāng)C#程序被編譯時,編譯器會對程序的所有編譯單元進行統(tǒng)一處理。在一個編譯單元中命名空間名的聲明必須惟一,不能出現(xiàn)同名命名空間,否則系統(tǒng)會出現(xiàn)編譯錯誤。另外,雖然編譯單元可能會相互依賴,但編譯單元使用的命名空間調(diào)用語句只對本單元的屬性和命名空間成員聲明產(chǎn)生影響,不會影響到其他的編譯單元中。第7章面向?qū)ο蠛皖?.2.1命名空間的聲明89形式1:
namespaceNameSpaceOutside{//命名空間NameSpaceOutside的定義體部分
namespaceNameSpaceInside{//命名空間NameSpaceInside的定義體部分
}}形式2:
namespaceNameSpaceOutside.NameSpaceInside{//命名空間NameSpaceInside的定義體部分
}命名空間中的各個成員,如果沒有另外聲明,默認(rèn)的訪問修飾符是public,在其他命名空間中可以直接訪問。命名空間聲明時可以嵌套。例如:形式1:形式2:命名空間中的各個成員,如果沒有另外聲明,默認(rèn)90
如果在一個命名空間中使用其他已定義好的命名空間,只需要在這個命名空間使用using語句便可對其他命名空間進行引用。例如:NamespaceMyNameSpace{usingSystem;
usingNameSpaceOutside;
//命名空間的其他定義部分}
在該例中,命名空間MyNameSpace在定義體中引用了系統(tǒng)命名空間System和此前定義的命名空間NameSpaceOutside。注意,在一個命名空間體內(nèi),如果要引用其他命名空間,應(yīng)該在聲明其他任何類型之前引用。在該例中,如果把兩行using命令放置到“命名空間的其他定義部分”之后就會出現(xiàn)編譯錯誤。如果在一個命名空間中使用其他已定義好的命名空間,只需91
如果多個命名空間具有相同的完整合法名稱,那么這幾個命名空間屬于一個命名空間。namespaceNameSpace{classA{}}namespaceNameSpace{classB{}}
該例中,兩個命名空間聲明具有相同的完整合法名NameSpace,所以它們屬于同一個命名空間。此后對命名空間NameSpace中的類訪問時,只需要直接使用NameSpace.A或NameSpace.B即可。如果多個命名空間具有相同的完整合法名稱,那么這幾個命92第7章面向?qū)ο蠛皖?.2.2命名空間的成員
在一個命名空間中可以包含多個成員聲明,這些聲明共同組成了這個命名空間的成員。命名空間的成員類型多種多樣,可以是一個類、結(jié)構(gòu)、接口、枚舉、委托等結(jié)構(gòu),也可以是另一個命名空間。無論是哪一種,命名空間成員類型聲明都分別和各自類型聲明要求一致。
第7章面向?qū)ο蠛皖?.2.2命名空間的成員93第7章面向?qū)ο蠛皖?.2.2命名空間的成員
類型聲明可以出現(xiàn)在編譯單元的第一行中作為頂層聲明,也可以出現(xiàn)在命名空間、類或結(jié)構(gòu)的內(nèi)部作為成員聲明。如果類型聲明以頂層聲明出現(xiàn),新聲明的類型作為一個獨立于其他編譯單元的類型,此時,這個類型的名字本身就是它的完整合法名稱。如果一個類型聲明在一個命名空間、類或結(jié)構(gòu)內(nèi)部,那么此類型就以它所在的命名空間、類或結(jié)構(gòu)的成員身份出現(xiàn),它的完整合法名應(yīng)該與所在命名空間、類或結(jié)構(gòu)關(guān)聯(lián)起來表示,中間以“.”隔開。例如:用S代表要聲明的類型,N代表命名空間、類或結(jié)構(gòu)。如果S是頂層聲明,則S的完整合法名就是簡單的類型S,如果類型S聲明在N內(nèi)部,則S的完整合法名就是N.S
第7章面向?qū)ο蠛皖?.2.2命名空間的成員94第7章面向?qū)ο蠛皖?.2.2命名空間的成員
對類型聲明的訪問權(quán)限與該類型聲明所處的位置有關(guān):(1)在編譯單元或者命名空間中聲明的類型,可以具有公有(public)或內(nèi)部(internal)兩種訪問權(quán)限。默認(rèn)的訪問權(quán)限是內(nèi)部。(2)在類中聲明的類型,訪問權(quán)限可以是公有(public)、保護(protected)、內(nèi)部(internal)、私有(private),默認(rèn)的訪問方式是私有。(3)在結(jié)構(gòu)中聲明的類型,訪問權(quán)限可以是公有(public)、保護(protected)、私有(private),默認(rèn)的訪問方式是私有。第7章面向?qū)ο蠛皖?.2.2命名空間的成員95第7章面向?qū)ο蠛皖?.2.3命名空間的使用
在C#中,命名空間的調(diào)用是通過using指令實現(xiàn)的。using指令有兩種用途:一種是別名使用指令,可以定義一個命名空間或類型的別名;另一種是命名空間使用指令,可以引入一個命名空間的類型成員。
using指令的有效范圍是指該指令所屬的編譯單元或命名空間。第7章面向?qū)ο蠛皖?.2.3命名空間的使用96第7章面向?qū)ο蠛皖?.2.3命名空間的使用(1)別名使用指令與C或C++中的#define命令類似,C#中可以使用別名使用指令為命名空間或類型定義別名,此后的程序就可以使用這個別名來代替定義的這個命名空間或類型。別名使用指令的格式為:
using別名=命名空間名或類型名;利用別名使用指令可以避免使用冗長的命名空間,例如下面代碼:usingLastMessage=MyProgram.MessageManagement.AllMessage.NextMessage;第7章面向?qū)ο蠛皖?.2.3命名空間的使用利用別名使用指97再看下面的例子:namespaceNameSpace1.NameSpace2{classA{}}namespaceNameSpace3{usingR=NameSpace1.NameSpace2.A;
classB:R{}}namespaceNameSpace1.NameSpace2{classA{}}namespaceNameSpace3{usingR=NameSpace1.NameSpace2;
classB:R.A{}}再看下面的例子:namespaceNameSpace1.N98利用別名使用指令所定義的別名的有效范圍是該指令所屬的編譯單元或命名空間,因此這里的別名在該編譯單元或命名空間中應(yīng)該是惟一的,不能與其它成員同名,否則就會出錯。例如:namespaceNameSpace1{}namespaceNameSpace2{classClassA{}}namespaceNameSpace2{usingClassA=NameSpace1;}這里的三個命名空間中,后兩個命名空間名一樣,是同一個命名空間。這兩個命名空間中,前一個聲明了一個類ClassA,后一個引用了一個別名使用指示ClassA。二者雖然類型不同,但由于這兩個成員同名,所以出錯。利用別名使用指令所定義的別名的有效范圍是該指令所屬的編譯單元99在使用別名時,如果別名所定義的命名空間或命名空間中的成員不存在,同樣會出現(xiàn)錯誤。例如:namespaceNameSpace1{classClassA{}}namespaceNameSpace2{usingR=NameSpace1.ClassA;classClassB:R.ClassA}在使用別名時,如果別名所定義的命名空間或命名空間中的成員不存100與一般成員一樣,別名使用指令定義的別名在整個命名空間或整個編譯單元內(nèi)都有效,該命名空間內(nèi)其他成員都可直接使用。例如:usingR=NameSpace1;//假設(shè)此前已定義NameSpace1,并且有一個成員是類AnamespaceNameSpace2{classClassB:R.A{}}namespaceNameSpace3{classClassC:R.A{}}與一般成員一樣,別名使用指令定義的別名在整個命名空間或整個編101當(dāng)在一個編譯單元中同時聲明多個別名時,別名的聲明順序沒有關(guān)系,并且每個別名的聲明不會受到自身或別的別名的影響。例如:namespaceNameSpace1.NameSpace2{}namespaceNameSpace3{usingr1=NameSpace1;usingr2=NameSpace1.NameSpace2;usingr3=r1.NameSpace2;}當(dāng)在一個編譯單元中同時聲明多個別名時,別名的聲明順序沒有關(guān)系102第7章面向?qū)ο蠛皖?.2.3命名空間的使用(2)命名空間使用指令命名空間使用指令可以將一個命名空間的類型整個導(dǎo)入到另一個編譯單元或命名空間中,并且對這些類型的使用不需要使用完整合法名稱,直接引用類型名稱即可。命名空間使用指令的格式為:
using命名空間名;命名空間名應(yīng)該是由系統(tǒng)提供的或用戶已定義的命名空間名。和別名不同的是:在包含命名空間的編譯單元或命名空間定義體內(nèi)部,別名在成員聲明時需要引用別名的成員,而命名空間可以直接使用已定義的命名空間的類型,不需要指出命名空間名。第7章面向?qū)ο蠛皖?.2.3命名空間的使用命名空間名應(yīng)該103例如對于大家比較熟悉的系統(tǒng)預(yù)定義的命名空間System,引用該命名空間后,可以直接使用其中的成員。usingSystem;classTest{staticvoidMain(){Console.WriteLIne(“Hello,World!”);}}例如對于大家比較熟悉的系統(tǒng)預(yù)定義的命名空間System,引用104對于用戶自己定義的命名空間,先定義用戶自己的命名空間后也可以直接使用,例如:namespaceNameSpace1.NameSpace2{classClassA{//命名空間NameSpace1.NameSpace2的類ClassA定義體
}}namespaceNameSpace3{usingNameSpace1.NameSpace2;classClassB:ClassA{}}對于用戶自己定義的命名空間,先定義用戶自己的命名空間后也可以105注意:命名空間使用指令只能導(dǎo)入命名空間本身,而不會導(dǎo)入嵌套的命名空間,例如:namespaceNameSpace1.NameSpace2{classClassA{//命名空間NameSpace1.NameSpace2的類ClassA定義體
}}namespaceNameSpace3{usingNameSpace1;classClassB:NameSpace2.ClassA//出錯
{}}注意:命名空間使用指令只能導(dǎo)入命名空間本身,而不會導(dǎo)入嵌套的106如果在編譯單元或命名空間中定義的成員名與命名空間名相同,編譯器將按成員名優(yōu)先的原則。例如:namespaceNameSpace1{classClassA{}classClassB{}}namespaceNameSpace2{usingNameSpace1;classClassB{}}命名空間NameSpace2中使用了命名空間使用指令,但由于編譯器在編譯過程中,按在同一編譯單元或命名空間中成員優(yōu)先的原則,所以命名空間NameSpace2中的ClassB表示的是NameSpace2.ClassB,而不是NameSpace1.ClassB。NameSpace1.ClassB是指命名空間NameSpace1中的那個類ClassB。如果在編譯單元或命名空間中定義的成員名與命名空間名相同,編譯107如果在編譯單元或命名空間中有多個命名空間使用指令使用,而這些命名空間中又包含了相同的類型名,用戶定義和使用時要注意,不要引
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 四川省成都經(jīng)開區(qū)實驗中學(xué)2025屆數(shù)學(xué)高三第一學(xué)期期末學(xué)業(yè)水平測試模擬試題含解析
- 2025屆山東省泰安市東平高級中學(xué)高一上數(shù)學(xué)期末聯(lián)考模擬試題含解析
- 宜賓市重點中學(xué)2025屆數(shù)學(xué)高一上期末調(diào)研試題含解析
- 江蘇省蘇州市張家港市外國語學(xué)校2025屆語文高三上期末達(dá)標(biāo)測試試題含解析
- 2025屆安徽省北大附屬宿州實驗學(xué)校高三語文第一學(xué)期期末考試試題含解析
- 2025屆江蘇省蘇州市吳江高級中學(xué)生物高一第一學(xué)期期末檢測試題含解析
- 2025屆廣東省廣州中科語文高三上期末經(jīng)典試題含解析
- 阜新市重點中學(xué)2025屆數(shù)學(xué)高三第一學(xué)期期末學(xué)業(yè)質(zhì)量監(jiān)測模擬試題含解析
- 2025屆湖北省武漢第二中學(xué)生物高一上期末監(jiān)測試題含解析
- 2025屆江蘇省鹽城市濱??h高二數(shù)學(xué)第一學(xué)期期末調(diào)研模擬試題含解析
- 級配砂石換填專項施工方案(可編輯)
- 模擬汽車運輸振動測試指導(dǎo)書
- 形式發(fā)票格式2 INVOICE
- 零基預(yù)算在企業(yè)環(huán)境成本控制中的應(yīng)用
- 采油樹維護保養(yǎng)與操作
- 集油池施工方案Word版
- 衛(wèi)生院工程施工組織設(shè)計方案
- 小學(xué)三年級上冊道德與法治課件-3.做學(xué)習(xí)的主人(我和時間做朋友)-部編版(14張)ppt課件
- 玉米育種基地建設(shè)項目可行性研究分析報告
- 邏輯在高考語文中的運用
- 電梯維護保養(yǎng)規(guī)則
評論
0/150
提交評論