《面向?qū)ο蟾呒墤?yīng)用及C-sharp-語法新特性課件》由會員分享,可在線閱讀,更多相關(guān)《面向?qū)ο蟾呒墤?yīng)用及C-sharp-語法新特性課件(48頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、Click to edit title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,第,八,章,程序的生成、異常處理和調(diào)試,*,Click to edit title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,Click to edit title style,Click to edit Master text styles
2、,Second level,Third level,Fourth level,Fifth level,*,第,八,章,程序的生成、異常處理和調(diào)試,*,單擊此處編輯母版標題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,*,單擊此處編輯母版標題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,*,第,6,章 面向?qū)ο蟮母呒墤?yīng)用及,C#,語法新特性,6.1 類的繼承,C#,語言中可以讓你聲明一個新類作為另一個類的派生。派生類(也叫子類)繼承其父類的域、屬性、方法和接口等,子類也可以聲明新的域、屬性和方法等,這樣,繼承可以讓你重用父類的代碼,專注于子類代碼的編寫
3、。,第,6,章 面向?qū)ο蟮母呒墤?yīng)用及,C#,語法新特性,6.1 類的繼承,開始使用繼承實現(xiàn)一個類時,必須先從派生子類的現(xiàn)有類開始。這個現(xiàn)有的類(基類)可以是,.NET,系統(tǒng)框架類庫的一部分,也可以是其他應(yīng)用程序或,.NET,程序集的一部分,甚至可以把它作為現(xiàn)有應(yīng)用程序的一部分來創(chuàng)建。,一旦有了基類,就可以在該基類的基礎(chǔ)上實現(xiàn)一個或多個子類。每個子類都自動擁有該基類的所有方法、屬性和事件,包括每個方法、屬性和事件的實現(xiàn)代碼。子類可以添加自己的新方法、屬性和事件,用新的功能來擴展原始的接口。另外,子類還能使用自身的實現(xiàn)方法代替基類中的方法和屬性,重寫原來的行為,用新的行為來代替它。,繼承本質(zhì)上是一
4、種將現(xiàn)有類的功能合并到新子類中的方式。繼承也定義了合并方法、屬性和事件的規(guī)則,包括如何改變或代替它們,以及子類如何為其自身增加新的方法、屬性和事件。這些規(guī)則的具體內(nèi)容以及在,C#,中如何使用這些規(guī)則將在下面詳細介紹。,第,6,章 面向?qū)ο蟮母呒墤?yīng)用及,C#,語法新特性,6.1 類的繼承,1,、創(chuàng)建基類,在,C#,語言平臺中,創(chuàng)建出來的任何類都可以作為基類,派生其他的類。因此,如果沒有明確的在代碼中指明這個類不能作為基類,就可以從這個類中派生子類。,首先,用如下代碼創(chuàng)建一個,Employee,(職員)類:,public class Employee,這樣我們就有了一個基類。即使這個類不能做任何事
5、情或者不包括任何內(nèi)容,也可以繼承它。,第,6,章 面向?qū)ο蟮母呒墤?yīng)用及,C#,語法新特性,6.1 類的繼承,2,、創(chuàng)建子類,為了實現(xiàn)繼承,需要添加一個新類。以下面的代碼為例,創(chuàng)建一個,SalesForce,(銷售人員)類:,public class SalesForce,private decimal salesVolume;,private int salesManagerID;,/,銷售額,public decimal SalesVolume,/,所屬銷售經(jīng)理,ID,public int SalesManagerID,要使,SalesForce,類成為,Employee,類的一個子類,只需
6、修改,SalesForce,類的第一行代碼:,public class SalesForce:Employee,nizifn mynzf mynzf mynzg mynzg mynzg mljsgf mljnzf 0838mlj zhongtezc topbrightness/hd8go hd88go sj93 oemgc/189288 hzp580 yjoem,oemdg/xcdnpx/skfjk oemdg,zhongtezc yanjigz/zg-nsk skf-zt,nsk-zt/fag-zt/ntn-zt 189286/,xcdnpx/dgxcdn dgxcpx xcwxpx,xun
7、chi-px/oemfy 0759mz lczx188 189287/tiefen tjjkyq 0316baowencailiao/,第,6,章 面向?qū)ο蟮母呒墤?yīng)用及,C#,語法新特性,6.1 類的繼承,3,、重載方法,SalesForce,類通過繼承自動獲得了,Name,和,BirthDate,屬性,它還擁有自己的,SalesVolume,和,SalesManagerID,屬性。這就說明了可以給,SalesForce,子類添加方法和屬性來擴展基本的,Employee,接口。,可以給,SalesForce,類添加新的屬性、方法和事件,它們將成為任何基于,SalesForce,類型創(chuàng)建的對象的
8、一部分。這對,Employee,類沒有任何影響,僅影響,SalesForce,類和,SalesForce,對象。,甚至可以給子類添加和基類中的方法同名的方法,以擴展基類的功能,只要這些方法具有不同的參數(shù)列表即可。重載基類中的現(xiàn)有方法在本質(zhì)上與重載常規(guī)方法相同。,nizifn mynzf mynzf mynzg mynzg mynzg mljsgf mljnzf 0838mlj zhongtezc topbrightness/hd8go hd88go sj93 oemgc/189288 hzp580 yjoem,oemdg/xcdnpx/skfjk oemdg,zhongtezc yanjigz
9、/zg-nsk skf-zt,nsk-zt/fag-zt/ntn-zt 189286/,xcdnpx/dgxcdn dgxcpx xcwxpx,xunchi-px/oemfy 0759mz lczx188 189287/tiefen tjjkyq 0316baowencailiao/,第,6,章 面向?qū)ο蟮母呒墤?yīng)用及,C#,語法新特性,6.2.訪問控制符,訪問控制符是,C#,語言中的一類關(guān)鍵字,用于指定聲明的成員或類型的可訪問性。本節(jié)主要介紹,C#,語言中常用的四個訪問控制符:,public,、,protected,、,internal,和,private,。,public,關(guān)鍵字是類型和類型
10、成員的訪問控制符。,public,訪問控制符允許最高訪問級別。對訪問,public,修飾的成員沒有限制,如下所示:,class SampleClass,public int x;/,無訪問限制,第,6,章 面向?qū)ο蟮母呒墤?yīng)用及,C#,語法新特性,6.2.訪問控制符,protected,關(guān)鍵字是一個成員訪問控制符。,protected,修飾的成員在它的類中可訪問并且可由派生類訪問,也就是說,僅當訪問通過派生類類型發(fā)生時,基類的受保護成員在派生類中才是可訪問的。,第,6,章 面向?qū)ο蟮母呒墤?yīng)用及,C#,語法新特性,6.2.訪問控制符,internal,關(guān)鍵字是類型和類型成員的訪問控制符。只有在同一
11、程序集的文件中,內(nèi)部類型或成員才是可訪問的,第,6,章 面向?qū)ο蟮母呒墤?yīng)用及,C#,語法新特性,6.2.訪問控制符,private,關(guān)鍵字是一個成員訪問控制符。私有訪問是允許的最低訪問級別。私有成員只有在聲明它們的類和結(jié)構(gòu)體中才是可訪問的,第,6,章 面向?qū)ο蟮母呒墤?yīng)用及,C#,語法新特性,6.2.訪問控制符,通常一個成員或類型只能有一個訪問控制符,使用,protected internal,組合時除外。命名空間上不允許使用訪問控制符。命名空間沒有訪問限制。根據(jù)發(fā)生成員聲明的上下文,只允許某些聲明的可訪問性。如果在成員聲明中未指定訪問控制符,則使用默認的可訪問性。不嵌套在其他類型中的頂級類型的
12、可訪問性只能是,internal,或,public,。這些類型的默認可訪問性是,internal,。,第,6,章 面向?qū)ο蟮母呒墤?yīng)用及,C#,語法新特性,6.2.訪問控制符,訪問控制符在使用時也受一些條件的限制,比如聲明類型時,最重要的是查看該類型是否必須至少與其他成員或類型具有同樣的可訪問性。例如,直接基類必須至少與派生類具有同樣的可訪問性。以下聲明將導致編譯器錯誤,因為基類,BaseClass,的可訪問性小于,MyClass,:,class BaseClass.,public class MyClass:BaseClass./,錯誤,nizifn mynzf mynzf mynzg myn
13、zg mynzg mljsgf mljnzf 0838mlj zhongtezc topbrightness/hd8go hd88go sj93 oemgc/189288 hzp580 yjoem,oemdg/xcdnpx/skfjk oemdg,zhongtezc yanjigz/zg-nsk skf-zt,nsk-zt/fag-zt/ntn-zt 189286/,xcdnpx/dgxcdn dgxcpx xcwxpx,xunchi-px/oemfy 0759mz lczx188 189287/tiefen tjjkyq 0316baowencailiao/,nizifn mynzf myn
14、zf mynzg mynzg mynzg mljsgf mljnzf 0838mlj zhongtezc topbrightness/hd8go hd88go sj93 oemgc/189288 hzp580 yjoem,oemdg/xcdnpx/skfjk oemdg,zhongtezc yanjigz/zg-nsk skf-zt,nsk-zt/fag-zt/ntn-zt 189286/,xcdnpx/dgxcdn dgxcpx xcwxpx,xunchi-px/oemfy 0759mz lczx188 189287/tiefen tjjkyq 0316baowencailiao/,第,6,
15、章 面向?qū)ο蟮母呒墤?yīng)用及,C#,語法新特性,6.3.多態(tài)性,多態(tài)性(,polymorphism,)是面向?qū)ο蟪绦蛟O(shè)計中的一個重要概念,它是指同一個消息被不同類型的對象接收時產(chǎn)生不同的行為。所謂消息是指對類成員的調(diào)用,不同的行為是指調(diào)用了不同的類成員。,1,、方法的重載,方法重載(,function overload,)是指功能相似,方法名相同但所帶參數(shù)不同或返回值類型不同的一組方法。這里的“所帶參數(shù)不同”既可能是參數(shù)的數(shù)據(jù)類型不同也可能是參數(shù)的個數(shù)不同。在第五章,我們已經(jīng)簡單介紹了方法的重載。,第,6,章 面向?qū)ο蟮母呒墤?yīng)用及,C#,語法新特性,6.3.多態(tài)性,2,、隱藏基類方法,除了常規(guī)方法
16、重載之外,還有一些特殊情況需要考慮。例如,在有些情況下,希望往派生類中添加一個與基類中方法名相同,所帶參數(shù)也相同的成員方法。這種情況下程序運行時由于無法通過參數(shù)列表來確定調(diào)用基類還是派生類中的方法,所以對于這種特殊的方法重載我們需要隱藏基類中的方法,使通過派生類對象進行的方法調(diào)用能調(diào)用到派生類中的與基類中方法名相同,所帶參數(shù)也相同的成員方法。,在派生類中定義與基類中方法名相同,所帶參數(shù)也相同的成員方法時可以使用,new,關(guān)鍵字隱藏基類中的方法,。,第,6,章 面向?qū)ο蟮母呒墤?yīng)用及,C#,語法新特性,6.3.多態(tài)性,3,、虛方法,派生類定義的重載函數(shù)成員(函數(shù)名和參數(shù)類型與基類中函數(shù)成員相同)雖然可以隱藏基類的同名函數(shù)成員,但是只能通過派生類對象來調(diào)用派生類再定義的函數(shù)成員。如果使用基類變量引用派生類對象,然后通過基類變量調(diào)用該函數(shù)成員,訪問的僅僅是從基類繼承的同名函數(shù),無法訪問派生類定義的重載成員函數(shù)。,如何通過基類變量來訪問派生類中重載的函數(shù)成員呢?,C#,提供了虛方法機制來解決這個問題。首先在基類中將這個可能會被重載地方法通過,virtual,關(guān)鍵字定義為虛方法,接著在派生類中通過