C# 委託 && Virtual, abstract, override && 靜態建構函式
1.委託
一般來說我們都是針對資料來做操作,但是有時候需要針對方法來操作,這個時候就用到了委託。
委託將方法當作引數,當委託的返回值是void時,系統會先假定這是個多播委託。所謂多播委託,即多個方法都委託給了同一個委託類,用關鍵字(+=)。這個時候啟用委託,這些方法會依照被委託的順序而執行。可以取消委託,用關鍵字(-=)。
2.Virtual, abstract, override
Virtual是成員的修飾符,即虛擬函式,不能用來修飾靜態方法和類,因為沒有意義。被virtual修飾的方法表明希望被派生類來override, 而靜態方法無法override. 基於同樣的理由,private 和override 和 abstract不能和virtual一起來修飾方法。
abstract可以修飾方法和類,即抽象方法和抽象類。實際上一旦abstract修飾了一個方法,那麼該類也必須用abstract來修飾,即所謂的包含抽象方法的類一定是抽象類,但是需要注意的是抽象類不一定包含抽象方法。
抽象方法是沒有方法體的,派生類可以通過override關鍵字來實現它。
抽象方法看起來和介面比較類似,但是抽象類也有自己存在的意義:
(1)首先抽象類是對“物件”的抽象,而介面是一種行為規範。
(2)抽象類可以實現部分方法或者全部方法,而介面不能實現任何方法
(3)抽象類的方法的許可權可以是任意的,而介面必須是public
(4)抽象類的派生類不一定需要實現抽象類的所有方法,而實現介面的類必須實現介面所有的方法
(5)抽象類的成員變數不限許可權,而介面的成員變數一定是staticfinal的
一般來說,介面是為了實現多重繼承的,抽象類不能被多成繼承,但是介面可以。
不能override沒有修飾符virtual或者abstract的成員,因為類的成員預設是非虛的。
3.靜態建構函式
很少用到的概念,典型用途是,當類使用日誌檔案時,將使用靜態建構函式向日志文件中寫入資料。
另外也可以根據其特性來做一些只做一次的事情,例如匯入庫檔案之類。
靜態建構函式是被系統呼叫的,程式設計師無法手動呼叫。在建立第一個類的例項或者引用任何靜態成員之前,系統自動呼叫。該函式最多隻能被呼叫一次,在類中也最多隻有一個,又因為不能被繼承,所以和無參的建構函式不衝突。靜態建構函式沒有訪問修飾符和引數。
如果程式設計師沒有寫靜態建構函式,而類中包含帶初始值設定的靜態成員的話,編譯器會自動生成一個預設的靜態建構函式。