![面向?qū)ο缶幊蹋豪^承.ppt_第1頁](http://file1.renrendoc.com/fileroot2/2020-1/12/f4e6861c-1980-48cb-af98-ed9d52b1e509/f4e6861c-1980-48cb-af98-ed9d52b1e5091.gif)
![面向?qū)ο缶幊蹋豪^承.ppt_第2頁](http://file1.renrendoc.com/fileroot2/2020-1/12/f4e6861c-1980-48cb-af98-ed9d52b1e509/f4e6861c-1980-48cb-af98-ed9d52b1e5092.gif)
![面向?qū)ο缶幊蹋豪^承.ppt_第3頁](http://file1.renrendoc.com/fileroot2/2020-1/12/f4e6861c-1980-48cb-af98-ed9d52b1e509/f4e6861c-1980-48cb-af98-ed9d52b1e5093.gif)
![面向?qū)ο缶幊蹋豪^承.ppt_第4頁](http://file1.renrendoc.com/fileroot2/2020-1/12/f4e6861c-1980-48cb-af98-ed9d52b1e509/f4e6861c-1980-48cb-af98-ed9d52b1e5094.gif)
![面向?qū)ο缶幊蹋豪^承.ppt_第5頁](http://file1.renrendoc.com/fileroot2/2020-1/12/f4e6861c-1980-48cb-af98-ed9d52b1e509/f4e6861c-1980-48cb-af98-ed9d52b1e5095.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、C#高級編程:繼承,Kavass Zhu 2011/03/24,課程重點,實現(xiàn)繼承和接口繼承 多重繼承 調(diào)用函數(shù)的基類版本 虛方法、隱藏方法和方法的重寫 派生類的構造函數(shù) 抽象類和抽象函數(shù) 接口的定義和實現(xiàn),1.繼承的類型,繼承的類型主要包括兩種:實現(xiàn)繼承和接口繼承。 實現(xiàn)繼承:表示一個類型派生于一個基類型,擁有該基類型的所有成員字段和函數(shù),在實現(xiàn)繼承中,派生類型的每個函數(shù)采用基類型的實現(xiàn)代碼,除非在派生類型的定義中指定重寫該函數(shù)的實現(xiàn)代碼。在需要給現(xiàn)有類型添加功能,或許多相關的類型共享一個重要的公共功能時,這種類型的繼承是非常有效的。 接口繼承:表示一個類型只繼承類函數(shù)的簽名,沒有繼承任何實
2、現(xiàn)代碼。在需要指定該類型具有某些可用的特性時,最好使用這種類型的繼承。接口繼承常常被看做提供了一種契約:讓類型派生于接口,來保證為客戶提供某個功能。 在C#中,既有實現(xiàn)繼承,也有接口繼承。他們沒有強弱之分,因為這兩種繼承都完全內(nèi)置于語言中,因此很容易為不同的情形選擇最好的體系結構。C#不支持多重實現(xiàn)繼承,但支持多重接口繼承。 結構不支持實現(xiàn)繼承,但結構自動派生于System.ValueType,并且支持接口繼承。 結構總是派生于System.ValueType,還可以派生于任意多個接口 類總是派生于用戶選擇的另一個類,還可以派生于任意多個接口,如果要聲明一個類派生于另一個類,可以使用下面的語法
3、: class MyClass:MyBaseClass 如果類或結構也派生于接口,則用逗號分隔開基類和接口: class MyClass:MyBaseClass,IInterface1,IInterface2 對于結構語法如下: struct MyStruct:IInterface1,IInterface2 如果在類定義中沒有指定基類,C#編譯器就假定System.Object是基類。因此下面兩段代碼是相同的: class MyClass:Object class MyClass C#至此object關鍵字,它用作System.Object 類的假名,所以也可以寫成: clsss MyClas
4、s:object ,2.實現(xiàn)繼承,把一個基類函數(shù)聲明為virtual,該函數(shù)就可以在任何派生類中重寫。 Class MyBaseClass Public virtual string VirtualMethod() return “this is virtual method”; 也可以把屬性聲明為virtual。對于虛屬性或重寫屬性,語法與非虛屬性是相同的,但是要在定義中加上關鍵字virtual,其語法如下所示: public virtual string Name Get return _name; Set _name=value; ,2.1 虛方法,C#中虛函數(shù)的概念與標準OOP概念相同
5、,可以在派生類中重寫虛函數(shù)。在調(diào)用方法時,會調(diào)用對象類型合適的方法。C#中,函數(shù)默認不是徐牛的,但可以顯示的聲明為virtual。在派生類中需要重寫虛函數(shù)要使用override關鍵字顯式聲明: class MyClass:BaseClass Public override string VirtualMethod() return “this is override method”; 如果在派生類中沒有使用override關鍵字,并且派生類的函數(shù)名稱和簽名與基類中的函數(shù)和簽名一致時,將會產(chǎn)生編譯警告。 成員字段和靜態(tài)函數(shù)不能聲明為virtual。因為他只對類中的實例函數(shù)成員有意義。虛方法的聲明
6、和重寫不能是private。,如果簽名相同的方法在基類和派生類中都進行了聲明,但該方法沒有聲明為virtual和override,派生類方法就會隱藏基類方法。 在C#中隱藏方法有顯式隱藏和隱式隱藏兩種,一般建議用顯式隱藏。隱式隱藏會收到編譯器的警告信息。 class BaseClass Public void Test() 顯式隱藏 class MyClass:BaseClass Public new void Test() 隱式隱藏 class MyClass:baseClass public void Test() ,2.2 隱藏方法,C#有一種特殊的語法用于從派生類中調(diào)用方法的基類版本:
7、base.MethodName()。語法如下: class BaseClass Public virtual string getName() return “kavass”; Class MyClass:BaseClass public override string getName() return base.getName()+” zhu”; 這時MyClass的實例調(diào)用getName()方法是將得到的是基類的getName的方法加“ zhu”以后的字符串,2.3 調(diào)用函數(shù)的基類版本,C#允許把類和函數(shù)聲明為abstract,抽象類不能實例化,而抽象函數(shù)沒有執(zhí)行代碼,必須在非抽象的派生類
8、中重寫。如果類包含抽象函數(shù),該類將也是抽象的,也必須聲明為抽象的: abstract class BaseClass Public abstract string getName(); Class MyClass:BaseClass Public override string getName() Return “kavass”; 抽象函數(shù)不能聲明為private,在派生類中重寫時也不能是private。抽象函數(shù)不能有實現(xiàn)的主體。,2.4 抽象類和抽象函數(shù),C#允許把類和方法聲明為sealed。對于類來說,這表示不能繼承該類;對于方法來說,這表示不能重寫該方法。 在把類或方法標記為sealed
9、時,最可能的情形是:如果要對庫、類或自己編寫的其他類進行操作,則重寫某些功能會導致錯誤。也可以因商業(yè)原因把類或方法標記為sealed,以防止第三方以違法注冊協(xié)議的方式擴展該類。但一般情況下,在把類或標記為sealed時要小心,因為這么做會嚴重限制他的使用。即使不希望它能繼承一個類或重寫類的某個成員,仍有可能在將來的某個時刻,有人會遇到我們沒有預料的情形。.NET基類庫大量使用了密封類,使希望從這些類中派生出自己的類的第三方開發(fā)人員無法訪問這些類。 在方法上使用sealed關鍵字是沒有意義的,除非該方法本身是某個基類上另一個方法的重寫形式。如果定義一個新方法,但不想讓別人重寫它,首先就不要把它聲
10、明為virtual。但如果要重寫某個基類方法,sealed關鍵字就提供了一種方式,可以確保為方法提供的重寫代碼是最終的代碼。其他人不能再重寫它,2.5 密封類和密封方法,假定沒有為類定義任何顯式的構造函數(shù),這樣編譯器就會為所有的類提供默認的構造函數(shù),在后臺會進行許多操作,編譯器可以很好的解決層次結構中的所有問題,每個類中的字段都會初始化為默認值。但在添加一個我們自己的構造函數(shù)后,就要通過派生類的層次結構高效地控制構造過程,因此必須確保構造過程順利進行,不要出現(xiàn)不能按照層次結構進行構造的問題。 為什么派生類會有某些特殊的問題,原因是在創(chuàng)建派生類的實例時,實際上會有多個構造函數(shù)起作用。要實例化的類
11、的構造函數(shù)本身不能初始化類,還必須調(diào)用基類中的構造函數(shù)。這就是為什么要通過層次結構進行構造的原因。 構造函數(shù)的調(diào)用順序是先調(diào)用System.Object,再按照層次結構由上向下進行,直到到達編譯器要實例化的類為至。還要注意在這個過程中,每個構造函數(shù)都初始化自己的類中的字段。在開始添加自己的構造函數(shù)時,也應盡可能遵循這個規(guī)則。 class BaseClass private string name; Class MyClass:BaseClass Private int age; ,2.6 派生類的構造函數(shù),注意構造函數(shù)的執(zhí)行順序?;惖臉嬙旌瘮?shù)總是最先調(diào)用,也就是說,派生類的構造函數(shù)可以在執(zhí)行
12、過程中調(diào)用基類方法、屬性和其他成員,因為基類已經(jīng)構造出來,其字段也初始化了。 1.在層次結構中添加無參數(shù)的構造函數(shù) 首先討論最簡單的情況,在層次結構中用一個無參數(shù)的構造函數(shù)來替換默認的構造函數(shù)后,看看會發(fā)生什么情況。假如要把每個人的名字初始化為,而不是null引用,如下所示: Class BaseClass Private string name; Public BaseClass():base() Name=“”; Class Myclass:BaseClass prinvate int age; 上面的代碼運行正常,在MyClass實例化以后name將被出示化為。 在定制構造函數(shù)中,在執(zhí)行
13、基類構造函數(shù)前,添加一個多基類構造函數(shù)的調(diào)用,,使用的語法與我們以前學過的重載構造函數(shù)的語法相同。唯一的區(qū)別是將this換成base,這表示的是調(diào)用基類的構造函數(shù),而不是調(diào)用類本省的構造函數(shù)。在base關鍵字后面的圓括號中沒有參數(shù),這是非常重要的,因為沒有給基類構造函數(shù)傳遞參數(shù),所以編譯器會調(diào)用無參數(shù)的構造函數(shù),其結果是編譯器會自動調(diào)用System.Object的構造函數(shù)。 上面的代碼中的Base()可以省略,將會調(diào)用默認的基類的構造函數(shù)。 2.在層次結構中添加帶參數(shù)的構造函數(shù) Class BaseClass Private string name; Public BaseClass(stri
14、ng name) =name; Class Myclass:BaseClass prinvate int age; 代碼是否運行正常?,編譯器試圖為派生類創(chuàng)建默認構造函數(shù)時,會產(chǎn)生一個編譯錯誤,因為編譯器為子類生成默認的構造函數(shù)會調(diào)用父類的無參數(shù)構造函數(shù),但父類沒有這樣的構造函數(shù),因此需要為子類提供一個構造函數(shù),來避免這個錯誤: class BaseClass private string name; public BaseClass(string name) = name; class MyClass : BaseClass private int ag
15、e; public MyClass() : base(null) 子類在實例化的時候先會去調(diào)用父類的有參數(shù)的構造函數(shù),帶父類的構造函數(shù)執(zhí)行完畢,將繼續(xù)執(zhí)行子類的構造函數(shù)。,聲明接口在語法上與聲明抽象類完全相同,但不允許提供接口中任何成員的執(zhí)行方式。一般情況下,接口中只能包含方法、屬性、索引器和事件的聲明。 接口不能實例化,它只能包含其成員的簽名。接口不能有構造函數(shù)或字段。接口定義不允許包含運算符重載,這不是因為聲明他們在原則上有什么問題,而是因為接口通常是公共契約,包含運算符重載會一起一些與其他.NET語言不兼容得問題。在接口定義中還不允許聲明成員上的修飾符,因為接口的成員總是公共的,不能聲明
16、為虛擬和靜態(tài)的。 interface ITest void test(); ,3 接口,首先我們定義一個接口: interface IBank void PayIn(decimal amount); void Withdraw(decimal amount); decimal Balance get; 實現(xiàn)一個接口: class BuildBank : IBank private decimal balance; public void PayIn(decimal amount) balance+=amount;,3.1 定義和實現(xiàn)接口,Console.WriteLine(建設銀行提示:存款成
17、功,存入0!,amount); public bool Withdraw(decimal amount) bool result ; if (balance amount) result = false; Console.WriteLine(建設銀行提示:帳戶余額不足,取款失??!); else balance -= amount; result = true; Console.WriteLine(建設銀行提示:取款成功,請收取0現(xiàn)金!,amount); return result; ,class Program static void Main(string args) BuildBank buil = new BuildBank(); buil.PayIn(1000); buil.Withdraw(1200); buil.Withdraw(100); Console.WriteLine(buil.ToString(); IBank bank = new Bu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 供貨鋼材合同范例
- 勞務入駐合同范例
- 入境團隊合同范本
- 個人工地用工合同范例
- 業(yè)主接房物業(yè)合同范本
- 烏鎮(zhèn)景區(qū)商鋪租賃合同范例
- 出售廠房土地合同范例
- 產(chǎn)品押款合同范例寫
- 交易合同范例牛奶
- 7人合伙合同范本
- 2024美團簡化版商家合作合同標準文本一
- 2025年貴州黔源電力股份有限公司招聘筆試參考題庫含答案解析
- 《休閑食品加工技術》 課件 1 休閑食品生產(chǎn)與職業(yè)生活
- 春季開學安全第一課
- 2025年新生兒黃疸診斷與治療研究進展
- 廣東大灣區(qū)2024-2025學年度高一上學期期末統(tǒng)一測試英語試題(無答案)
- 課題申報書:數(shù)智賦能高職院校思想政治理論課“金課”實踐路徑研究
- 公司安全生產(chǎn)事故隱患內(nèi)部報告獎勵工作制度
- H3CNE認證考試題庫官網(wǎng)2022版
- 感統(tǒng)訓練培訓手冊(適合3-13歲兒童)
- 公司章程范本(完整版)
評論
0/150
提交評論