程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#的虛函數解析機制(3)

C#的虛函數解析機制(3)

編輯:關於C語言

例子很簡單,依照之前的規則,可以畫出如下一幅圖。圖中圓形的末端表示封閉、中斷繼承鏈;菱形的末端表示開放、允許構建繼承鏈;類描述中的等式,表示從該類型的對象引用調用對應方法(等號左邊的斜體)時,實際執行的代碼體是在何處(等號右邊的正常字體)定義的。

其實,為了確認這裡描述出來的方法的繼承鏈,甚至都不需要實地運行此代碼。將代碼放在Visual Studio裡,使用“重構”(Refactor)菜單中的“重命名”(Rename)修改方法名稱,待完成後就會發現在方法繼承鏈的中斷處,自動修改符號名稱的動作也中止了。

補充

對於 this 關鍵字,上述的規則也適用。只需要將 this 依照當前的代碼上下文翻譯為對應的類型引用,就可以依照之前敘述的方法確定最終調用的代碼了。例如在C中的Foo1方法裡假如有這麼一條語句:“this.Foo2()”。當在外部運行“D.Foo2()”時,就會就會解析到“C.Foo1()”,這時,C.Foo1()方法的內部在解析“this.Foo2()”時就會解析到D.Foo2()。

對於 base 關鍵字,則比較簡單,只是在基類的方法(這裡“基類的方法”一詞,請參見“用詞約定”的第6條。)中找到同名方法,然後調用,不存在解析虛函數的過程。

對於被委托對象包裝的方法指針,在調用委托時,仍會按照上述規則解析到正確的方法。

本文示例中使用了“Foo”開頭的方法名,而這個習慣借鑒自一些別的文章。這裡是有個典故還是怎麼?

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved