[.net 物件導向程式設計基礎] (8) 基礎中的基礎——修飾符
在進入C#物件導向核心之前,我們需要先對修飾符有所瞭解,其實我們在前面說到變數和常量的時候,已經使用了修飾符,並且說明了變數和常量的修改符。
首先 修飾符是什麼?
修飾符用於限定型別以及型別成員的申明
從定義可以看出按功能分為兩類:訪問修飾符和宣告修飾符
1.訪問修飾符 (5個)
訪問修飾符 |
說明 |
public |
公有訪問。不受任何限制。 |
private |
私有訪問。只限於本類成員訪問,子類,例項都不能訪問。 |
protected |
保護訪問。只限於本類和子類訪問,例項不能訪問。 |
internal |
內部訪問。只限於本專案內訪問,其他不能訪問。 |
protected internal |
內部保護訪問。只限於本專案或是子類訪問,其他不能訪問 |
C#成員型別的可修飾及預設修飾符如下表:
成員型別 |
預設修飾符 |
可被修飾符 |
enum |
public |
none |
class |
private |
public、protected、internal、private、 |
interface |
public |
none |
struct |
private |
public、internal、private |
2.宣告修飾符 (10個)
Partial:在整個同一程式集中定義分部類和結構
Static: 宣告屬於型別本身而不是屬於特定物件的成員。
Abstract:抽象類,只能是其他類的基類。類中的方法只宣告不實現,方法的實現在他的派生類中完成。
Sealed:指定類不能被繼承。
Virtual:用於修飾方法、屬性、索引器或事件宣告,並且允許在派生類中重寫這些物件
Override:提供從基類繼承的成員的新實現
New:作修飾符,隱藏從基類成員繼承的成員,在不使用 new 修飾符的情況下隱藏成員是允許的,但會生成警告。作運算子,用於建立物件和呼叫建構函式。
Extern:用於宣告在外部實現的方法。 extern 修飾符的常見用法是在使用 Interop 服務調入非託管程式碼時與 DllImport 特性一起使用。 在這種情況下,還必須將方法宣告為 static
Readonly:修飾欄位,表示該欄位為只讀欄位。
注意:readonly修飾引用型別時由於操作不當可能修改該只讀物件狀態。例如:Readonly List< Person> persons=….;
我們可能在某些地方對persons 進行了修改:persons.add(new Person());
Const:修飾欄位,表示該欄位為只讀欄位。並且在編譯時必須能夠明確知道該欄位的值,其值是硬編碼到程式中去的,修改了該型別成員後需要重新編譯才能使修改生效。
而readonly是執行時只讀,內容在執行時確定,所以修改了readonly型別成員後無需重新編譯即可生效。
Readonly不能修飾區域性變數,const可以。
要點:
Virtual,override和new 的區別
virtual 用於父類中,宣告某方法可以重寫,該方法不能是static;
override(覆蓋繼承) 用於子類中,重寫父類中用virtual/override/abstract關鍵字宣告的方法;
new(隱藏繼承) 用於子類中,可修飾父類中有或無virtual宣告的方法;
如果在父類中有與父類同名同參的方法時,C#會隱式在子類前新增一個new關鍵字。
【區別】override與new
當將一個子類例項賦值給父類例項,在子類例項與父類例項中分別呼叫該方法時:使用override修飾的都將呼叫子類方法,而使用new修飾的會分別呼叫子類方法和父類方法。
New和Override這兩個關鍵字是互斥的。不可以同時使用。
【區別】virtual與abstract
virtual:用於父類中宣告該方法可被重寫。
abstract:只能用在抽象類中宣告抽象方法,本身不能實現任何功能(因此必須在子類中override),不能例項化。
兩者除了在子類中同樣可以用override重寫這個相同點之外,沒有其他關係。
==============================================================================================
返回目錄
<如果對你有幫助,記得點一下推薦哦,有不明白的地方或寫的不對的地方,請多交流>
==============================================================================================