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.靜態構造函數

很少用到的概念,典型用途是,當類使用日誌文件時,將使用靜態構造函數向日志文件中寫入數據。

另外也可以根據其特性來做一些只做一次的事情,例如導入庫文件之類。

靜態構造函數是被系統調用的,程序員無法手動調用。在創建第一個類的實例或者引用任何靜態成員之前,系統自動調用。該函數最多隻能被調用一次,在類中也最多隻有一個,又因爲不能被繼承,所以和無參的構造函數不衝突。靜態構造函數沒有訪問修飾符和參數。

如果程序員沒有寫靜態構造函數,而類中包含帶初始值設定的靜態成員的話,編譯器會自動生成一個默認的靜態構造函數。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章