突然有一天同事在問:
要怎麼定義一個類別的方法成員, 而且還提供一些方法實作給子類別用, 然後子類別可以選擇性覆寫?
頓時突然冒出 Abstract? Virtual?, 不可能是 Abstract! 因為 Abstract 不可實作, 而且不能選擇性覆寫!
沒錯就是 Virtual 了!
這次狀況跟 上一篇文章 一樣狀況
雖然懂這些修飾詞, 但時間久了還是會忘記
因此就誕生了這篇文章, 方便自己快速複習
也希望能幫助到跟我一樣狀況的人
Abstract (抽象)
- 類別不可宣告為 final class
- 類別不可被 new 實體化
- 類別不可讓一般類別(class)多重繼承抽象類別
- 類別可以繼承其他抽象類別
- 類別可以定義, 但不可實作
- 方法可以定義, 但不可實作
- 方法必須全部宣告 Public 修飾詞
- 方法抽象方法只能在抽象類別中定義
- 方法繼承抽象類別的子類必須覆寫所有抽象類別的抽象方法
Class (類別)
- 可以使用 new 建立實體物件
- 可以定義虛擬方法, 目的可以給繼承子類別覆寫
- 沒有定義虛擬方法不可覆寫, 但可以用 new 修飾詞來隱藏, 換句話說叫用最近類別方法來執行
Virtual (虛擬)
- 類別不可在靜態屬性上使用 virtual
- 方法定義後一定要實作, 必須為Public
- 方法允許繼承的子類別覆寫
- 方法繼承虛擬類別的子類別可選擇性選擇覆寫的虛擬方法
Interface (介面)
- 類別可以繼承其他介面類別
- 類別不可以繼承一般類別
- 類別可以多重繼承多個介面
- 類別不能有常數、欄位、運算子、執行個體建構
- 方法只能定義, 不可實作, 必須為Public
- 方法繼承介面的類別必須實作所有方法
- 方法方法必須都是抽象 (預設)
Static (靜態)
- 不可被繼承
- 不用實體化就可以使用
- 不能叫用this中的static方法或屬性
Const (常數)
- 宣告後不可修改
- 編譯時期的常數 (靜態常數)
- 型態只能數字, 字串, 列舉
- 可在方法中使用
- 不建議宣告存儲商業行為的敏感資料
Readonly (唯讀)
- 實值型別會直接包含其資料,因此具有 readonly 實值型別的欄位是不可變的
- 執行時期的常數 (動態常數)
- 型態可以任意型態
- 不可在方法中使用
- readonly 修飾詞可防止欄位被不同的參考型別執行個體取代
Async (匿名, Lambda)
- 顧名思義非同步, 主要為I/O的非同步處理
- 必須搭配 await 運算子, 不阻塞調用方法執行緒
- 不可宣告任何 in, ref, out 參數
Extern (外部)
- 從外部 DLL 載入實作
Sealed (密封)
- 防止其他類別繼承該類別
Delegate (委派)
- 沒有內容的方法
- 必須實體化委派, 在叫用(invoke)委派, 委派就會呼叫封裝的方法
Override (覆寫)
- 在方法上面宣告, 主要要覆寫抽象(abstract)方法, 虛擬(virtual)方法或override
- 無法覆寫非虛擬或靜態方法
- 不能使用 new、static 或 virtual 修飾詞來修改 override 方法
Unsafe (不安全)
- 要編譯不安全的代碼,必須指定-unsafe編譯器選項
- Common Language Runtime 不會驗證不安全的程式碼
Volatile
- 不受限於這些最佳化考量
- 可確保所有的執行緒都會依執行寫入的順序
- 只能套用至 class 或 struct 的欄位
- 區域變數不可宣告
參考
- http://vito-note.blogspot.com/2014/08/blog-post_65.html
- https://docs.microsoft.com/zh-tw/dotnet/csharp/language-reference/keywords/