【軟工基本功】抽象? 虛擬? 各種修飾詞特性

突然有一天同事在問:

要怎麼定義一個類別的方法成員, 而且還提供一些方法實作給子類別用, 然後子類別可以選擇性覆寫?

頓時突然冒出 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/

留言

Top