設定Virtual關鍵字後,允許衍生類別(Derived Class)覆寫(override)其狀態或行為。

名詞定義

為了避免混淆,先來點名詞定義:

  • 基礎類別(Base Class):在物件導向繼承關係中,扮演父類別的角色
  • 衍生類別(Derived Class):在物件導向繼承關係中,扮演子類別的角色
  • 覆寫(Override):衍生類別中的某個實作取代基礎類別中的某個實作的行為
  • 虛擬成員(Virtual Member):在基礎類別中的成員增加了virtual關鍵字後,我們將該成員稱為虛擬成員
  • 覆寫成員(Overriding Member):衍生類別的成員覆寫基礎類別的虛擬成員後,我們將衍生類別中的該成員稱為覆寫成員。

虛擬成員的特性

Virtual關鍵字可以用在方法(method)、屬性(property)、索引子(indexer)或事件(event),我們將這些被加上virtual關鍵字的成員稱為虛擬成員。

這些虛擬成員「允許」被衍生類別覆寫,換句話說就是可覆寫可不覆寫,完全看衍伸類別的心情。

而因為有些想覆寫有些不想覆寫。有覆寫的衍生類別中一定會實作某些程式碼覆寫虛擬成員,自然會有東西可以被執行。而沒有覆寫的衍生類別中一定不會有程式碼可以被執行。為了照顧到那些沒有覆寫的,在虛擬成員就必須實作某些東西讓那些沒有要覆寫的執行。這就是為什麼使用virtual宣告的這些成員需要實作,而用abstract關鍵字宣告的成員不用實作的原因。

使用方法

使用Virtual的方法很簡單,只需要兩個步驟:

  1. 在基礎類別中要被覆寫的成員加上virtual關鍵字
  2. 在衍生類別中要覆寫虛擬成員的同名同型態的成員加上override關鍵字

使用此方法便可以正確的宣告虛擬成員及覆寫成員。

Override關鍵字的重要性

由於編譯器的檢查機制,我們必須明確宣告override才能正確的覆寫基礎類別的虛擬成員。檢查流程如下:

  1. 檢查宣告類別中,該成員是否被宣告為虛擬成員,若不是虛擬成員則直接執行該成員。
  2. 若該成員是虛擬成員,則檢查實體類別中,該成員是否有被加上override關鍵字,若有則執行帶有override的成員。
  3. 若實體類別的成員沒有被加上override,則會一直往父類別找,直到找到第一個覆寫虛擬成員的類別,並執行該類別內的成員。

依照此特性可得知若沒有在衍生類別中將成員宣告為override,則不會覆寫基礎類別中的虛擬成員,若要覆寫虛擬成員,一定要加上override關鍵字確保覆寫行為的正確性。

參考資料