第十五回繼承本質論_第1頁
第十五回繼承本質論_第2頁
第十五回繼承本質論_第3頁
第十五回繼承本質論_第4頁
第十五回繼承本質論_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第十五回:繼承本質論發(fā)布日期:2007.9.10 作者:Anytao2007,作品,請注明作者和出處。本文將介紹以下內容:繼承?繼承的實現(xiàn)本質1.引言關于繼承,你是否駕熟就輕,關于繼承,你是否了如指掌。繼承的基本概念,回歸本質,從編譯器運行的角度來揭示.NET 繼承中的運本文不行本源,來發(fā)現(xiàn)子類對象是如何實現(xiàn)了對父類成員與方法的繼承,以最為簡陋的示例來揭示繼承的實質,闡述繼承機制是如何被執(zhí)行的,這對于更好的理解繼承,是必要且必然的。2. 分析下面首先以一個簡單的動物繼承體系為例,來進行說明:public abstract class Animalpublic abstract void Sho

2、wType(); public void Eat()Console.Wriine(Animal always eat.);public class Bird: AnimalaVXOGZK YZXOTM Z_VK # (OXJ !VHROI UKXXOJK UOJ 9NU:_VK a)UTYURK =XOOTK :_VK OY a c Z_VK !cVXOGZK YZXOTM IURUX!VHROI YZXOTM )URUXaMKZ a XKZXT IURUX! cYKZ a IURUX # GRK! cccVHROI IRGYY )NOIQKT (OXJaVXOGZK YZXOTM Z_VK

3、# )NOIQKT !VHROI UKXXOJK UOJ 9NU:_VK a)UTYURK =XOOTK :_VK OY a c Z_VK !cVHROI UOJ 9NU)URUX a)UTYURK =XOOTK )URUX OY a c )URUX !然后,在測試類中創(chuàng)建各個類對象,由于 Animal 為抽象類,cken 對象。只創(chuàng)建 Bird 對象和 Chi下面從編譯角度對這一簡單的繼承示例進行深入分析,從而了解.NET強調的繼承機制。是如何實現(xiàn)(1)簡要的分析一下對象的創(chuàng)建過程:Bird bird 創(chuàng)建的是一個 Bird 類型的,而 new Bird()完成的是創(chuàng)建 Bird 對象,分配

4、內存空間和初始化操作,然后將這個對象賦給 bird象的關聯(lián)。,也就是建立 bird與 Bird 對(2)從繼承的角度來分析在編譯器編譯期是如何執(zhí)行對象的創(chuàng)建過程,因為繼承的本質就體現(xiàn)于對象的創(chuàng)建過程。在此以Chicken 對象的創(chuàng)建為例,首先是字段,對象一經創(chuàng)建,會首先找到其父類 Bird,并為其字段分配空間,而 Bird 也會繼續(xù)找到其父類 Animal,為其分配空間,依次類推直到遞歸結束,也就是完成 System.Object 內存分配為止??梢栽诰幾g器中單步執(zhí)行的方法來大致了解其分配的過程和順序,因此,對象的創(chuàng)建過程是按照順序完成了對整個父類及其本身字段的內存創(chuàng)建,并且字段的順序是由上到

5、下排列,object 類的(OXJ GTOSGR # TK (OXJ !VHROI IRGYY :KYZ/TNKXOZGTIKaVHROI YOI UOJ 3GOT a(OXJ HOXJ # TK (OXJ !)NOIQKT INOIQKT # TK )NOIQKT !cccc字段排在最前面,其原因是如果父類和子類出現(xiàn)了同名字段,則在子類對象創(chuàng)建時,編譯器會自動認為這是兩個不同的字段而加以區(qū)別。然后,是方法表的創(chuàng)建,必須明確的一點是方法表的創(chuàng)建是類第一次加載到 CLR 時完成的,在對象創(chuàng)建時只是將其附加成員 TypeHandle 指向方法列表在 Loader Heap 上的地址,將對象與其動態(tài)

6、方法列表相關聯(lián)起來,因此方法表是先于對象而存在的。類似于字段的創(chuàng)建過程,方法表的創(chuàng)建也是父類在先子類在后,原因是顯而易見的,類 Chicken 生成方法列表時,首先將 Bird 的所有方法拷貝一份,然后和 Chicken 本身的方法列表做以對比,如果有覆寫的虛方法則以子類方法覆蓋同名的父類方法,同時添加子類的新方法,從而創(chuàng)建完成 Chicken的方法列表。這種創(chuàng)建過程也是逐層遞歸到 Object 類,并且方法列表中也是按照順序排列的,父類子類在后,其原因和字段大同小異,留待讀者自己體味。結合如下:的分析過程,現(xiàn)在將對象創(chuàng)建的過程以簡單的圖例來揭示其在內存中的分配情形,htt/從下的分析,和上面

7、的對象創(chuàng)建過程可見,對繼承的本質有了更明確的認識,對于以就有了清晰明白的:繼承是可傳遞的,子類是對父類的擴展,必須繼承父類方法,同時可以添加新方法。子類可以調用父類方法和字段,而父類不能調用子類方法和字段。虛方法如何實現(xiàn)覆寫操作,使得父類指針可以指向子類對象成員。new 關鍵字在虛方法繼承中的阻斷作用。你是否已經找到了理解繼承、理解動態(tài)編譯的不二。3. 思考通過上面的講述與分析,基本上對.NET 在編譯期的實現(xiàn)原理有了大致的了解,但是還有以下,一定會引起一定的疑惑,那就是:(OXJ HOXJ # TK )NOIQKT !這種情況下,bird2.ShowType 應該返回什么值呢?而 bird2

8、.type 有該是什么值呢?有兩個原則,是.NET 專門用于解決這一問題的:關注對象原則:調用子類還是父類的方法,取決于創(chuàng)建的對象是子類對象還是父類對象,而不是它的類型。例如 Bird bird2 = new Chicken()時,關注的是其創(chuàng)建對象為 Chicken 類型,因此子類將繼承父類的字段和方法,或者覆寫父類的虛方法,而不用關注 bird2 的類型是否為 Bird。類型不同的區(qū)別決定了不同的對象在方法表中不同的權限。注意根據關注對象原則,那么下面的兩種情況又該如何區(qū)別呢?根據上文的分析,bird2 對象和 chicken 對象在內存布局上是一樣的,差別就在于其指針的類型不同:bird

9、2 為 Bird 類型指針,而 chicken 為 Chicken 類型指針。以方法調用為例,不同的類型指針在虛擬方法表中有不同的附加信息作為標志來區(qū)別其的地址區(qū)域,稱為 offset。不同類型的指針只能在其特定地址區(qū)域內進行執(zhí)行,子類覆蓋父類時會保證其地址區(qū)域的一致性,從而解決了不同的類型具有不同的權限問題。(OXJ HOXJ # TK )NOIQKT !)NOIQKT INOIQKT # TK )NOIQKT !執(zhí)行就近原則:對于同名字段或者方法,編譯器是按照其順序查找來的,也就是首先 離它創(chuàng)建最近的字段或者方法,例如上例中的 bird2,是 Bird 類型,因此會首先 Bird_type

10、(注意編譯器是不會重新命名的,在此是為區(qū)分起見),如果 t ype 類型設為 public,則在此將返回“Bird”值。這也就是為什么在對象創(chuàng)建時必須將字段按順序排列,而父類要先于子類編譯的原因了。思考1.分析到 bird2.type 的值是“Bird”,那么 bird2.ShowType()會顯示什么值呢?上面是“Type is Chicken”,根據本文上面的分析,想想到底為什么?2.關于 new 關鍵字在虛方法動態(tài)調用中的阻斷作用,也有了更明確的理論基礎。在子類方法中,如果標記 new 關鍵字,則意味著隱藏基類實現(xiàn),其實就是創(chuàng)建了與父類同名的另一個方法,在編譯中這兩個方法處于動態(tài)方法表的不同地址位置,父類方法排法排在后面。面,子類方4. 結論在.NET 中,如果創(chuàng)建一個類,則該類總是在繼承。這緣于.NET

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論