[你必須知道的.NET] 第十七回:貌合神離:覆寫和重載
[2] [你必須知道的.NET] 第十七回:貌合神離:覆寫和重載
系列文章導航:
[你必須知道的.NET] 第四回:后來居上:class和struct
[你必須知道的.NET] 第五回:深入淺出關鍵字---把new說透
[你必須知道的.NET] 第六回:深入淺出關鍵字---base和this
[你必須知道的.NET] 第七回:品味類型---從通用類型系統開始
[你必須知道的.NET] 第八回:品味類型---值類型與引用類型(上)-內存有理
[你必須知道的.NET] 第九回:品味類型---值類型與引用類型(中)-規則無邊
[你必須知道的.NET] 第十回:品味類型---值類型與引用類型(下)-應用征途
[你必須知道的.NET] 第十一回:參數之惑---傳遞的藝術(上)
[你必須知道的.NET] 第十二回:參數之惑---傳遞的藝術(下)
[你必須知道的.NET] 第十三回:從Hello, world開始認識IL
[你必須知道的.NET] 第十四回:認識IL代碼---從開始到現在
[你必須知道的.NET] 第十六回:深入淺出關鍵字---using全接觸
[你必須知道的.NET]第二十二回:字符串駐留(上)---帶著問題思考
[你必須知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二
本文將介紹以下內容:
• 什么是覆寫,什么是重載
• 覆寫與重載的區別
• 覆寫與重載在多態特性中的應用
1. 引言
覆寫(override)與重載(overload),是成就.NET面向對象多態特性的基本技術之一,兩個貌似相似而實則不然的概念,常常帶給我們很多的誤解,因此有必要以專題來討論清楚其區別,而更重要的是關注其在多態中的應用。
在系列中,我們先后都有關于這一話題的點滴論述,本文以專題的形式再次做以深度討論,相關的內容請對前文做以參考。
2. 認識覆寫和重載
從一個示例開始來認識什么是覆寫,什么是重載?
Code
2.1 覆寫基礎篇
覆寫,又稱重寫,就是在子類中重復定義父類方法,提供不同實現,存在于有繼承關系的父子關系。當子類重寫父類的虛函數后,父類對象就可以根據根據賦予它的不同子類指針動態的調用子類的方法。從示例的分析,總結覆寫的基本特征包括:
• 在.NET中只有以virtual和abstract標記的虛方法和抽象方法才能被直接覆寫。
• 覆寫以關鍵字override標記,強調繼承關系中對基類方法的重寫。
• 覆寫方法要求具有相同的方法簽名,包括:相同的方法名、相同的參數列表和相同的返回值類型。
概念:虛方法
虛方法就是以virtual關鍵字修飾并在一個或多個派生類中實現的方法,子類重寫的虛方法則以override關鍵字標記。虛方法調用,是在運行時確定根據其調用對象的類型來確定調用適當的覆寫方法。.NET默認是非虛方法,如果一個方法被virtual標記,則不可再被static、abstrcat和override修飾。
概念:抽象方法
抽象方法就是以abstract關鍵字修飾的方法,抽象方法可以看作是沒有實現體的虛方法,并且必須在派生類中被覆寫,如果一個類包括抽象方法,則該類就是一個抽象類。因此,抽象方法其實隱含為虛方法,只是在聲明和調用語法上有所不同。abstract和virtual一起使用是錯誤的。
2.2 重載基礎篇
重載,就是在同一個類中存在多個同名的方法,而這些方法的參數列表和返回值類型不同。值得注意的是,重載的概念并非面向對象編程的范疇,從編譯器角度理解,不同的參數列表、不同的返回值類型,就意味著不同的方法名。也就是說,方法的地址,在編譯期就已經確定,是這一種靜態綁定。從示例中,我們總結重載的基本特征包括:
• 重載存在于同一個類中。
• 重載方法要求具有相同的方法名,不同的參數列表,返回值類型可以相同也可以不同(通過operator implicit 可以實現一定程度的返回值重載,不過不值得推薦)。
• .NET 2.0引入泛型技術,使得相同的參數列表、相同的返回值類型的情況也可以構成重載。