本文大部分內容摘自 《.NET開發專家·亮劍.NET : .NET深入體驗與實戰精要》 博主只是搬運工,不喜勿噴。 關於虛方法,抽象類這一部分一直不是太清楚,目前的工作中也接觸不到這些。 前幾天下載了一本書,發現寫的很形象,讓我豁然開朗。 整理一下,再打一遍,加深理解,也幫助更多的初學者瞭解這部分知 ...
本文大部分內容摘自 《.NET開發專家·亮劍.NET : .NET深入體驗與實戰精要》
博主只是搬運工,不喜勿噴。
關於虛方法,抽象類這一部分一直不是太清楚,目前的工作中也接觸不到這些。
前幾天下載了一本書,發現寫的很形象,讓我豁然開朗。
整理一下,再打一遍,加深理解,也幫助更多的初學者瞭解這部分知識。
1. sealed —— "斷子絕孫"
密封類不能被繼承。
密封方法可以重寫基類中的方法。但其本身不能在任何派生類中進一步重寫。
當應用於方法或屬性時,scaled 修飾符必須同 override 一同使用。
2. new —— “我是你的,你是我的”
new 關鍵字用於顯式隱藏從基類繼承的成員,也就是說在使用派生類時調用的方法是 new 關鍵字新定義的方法,而不是基類的方法。
不使用 new 關鍵字隱藏成員也是可以的,但是會產生警告。使用 new 顯式隱藏成員會取消次警告。
3. virtual —— “為了子孫和後代”
virtual 關鍵字用於修改方法或屬性的聲明,這種情況下,方法或屬性被稱作虛成員。虛成員的實現可又派生類中的重寫成員更改。
調用虛方法時,將為重寫成員檢查該對象的運行時類型。將調用大部分派生類中的該重寫成員,如果沒有派生類重寫該成員,則它可能是原始成員。
預設情況下,方法是非虛擬的。不能重寫非虛方法。
virtual 修飾符不能與 static、abstract, private 或 override 修飾符一起使用。 除了聲明和調用語法不同外,虛擬屬性的行為與抽象方法一樣。
通過使用override修飾符在派生類中重寫虛擬繼承屬性。
4. abstract —— “我是上帝”
abstract修飾符可以和 類,方法,屬性,索引器以及事件一起使用。
在類聲明中使用abstract修飾符以指示該類只能是其他類的基類。
抽象類的特性:
- 抽象類不能實例化。
- 抽象類可以包含抽象方法和抽象訪問器。
- 不能用sealed修飾符修改抽象類,這意味著該類不能被繼承。
- 從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實現。
- 從方法或屬性聲明中使用abstract修飾符以指示此方法或屬性不包含實現。
抽象方法的特性
- 抽象方法是隱式的 virtual 方法。
- 只允許在抽象類中使用抽象方法聲明。
- 抽象方法聲明不提供實際的實現,所以沒有方法體,方法聲明以 ; 結束,並且簽名後沒有 {} 符號。如 public abstract void MyMethod();
- 實現方法由overriding方法提供,它是非抽象類的成員。
- 在抽象方法聲明中使用 static 或 virtual 修飾符是錯誤的。
- 除了在聲明聲明和調用方法上不同外,抽選屬性的行為與抽象方法一樣。
5. override —— "一手遮天"
使用override修飾符來修改方法,屬性,索引器,或事件。主要提供派生類對基類方法的新實現,覆蓋 abstract 與 virtual 兩種修飾的成員。
重寫的基類方法 必須與重寫方法具有相同的簽名。
重寫的基類方法 必須是虛擬的,抽象的,或重寫的。不能重寫非虛方法或靜態方法。
不能使用 new,static,virttual 和 abstract 關鍵字修改重寫方法成員。
重寫屬性聲明必須制定與繼承屬性完全相同的訪問修飾符,類型,和名稱。並且重寫屬性必須是虛擬的,抽象的,或重寫的。
new 與 override 的相同點
- 都可以對基類成員進行隱藏,都可以使用 base 關鍵字調用基類成員
new 與 override 的區別
用 override 的基類的方法必須要用 virtual,而 new 不需要。
同一個基類對象調用基類的 virtual 方法時,override 重寫的派生類的方法會被訪問,而 new 重寫的派生類的方法不會被訪問。